详解Nginx中的重定向功能

合集下载

nginx80端口重定向到443端口

nginx80端口重定向到443端口

nginx80端⼝重定向到443端⼝nginx 80端⼝重定向到443端⼝,也就是http访问⾃动跳转到https配置如下:⼀、按照如下格式修改nginx.conf 配置⽂件,80端⼝会⾃动转给443端⼝,这样就强制使⽤SSL证书加密了。

访问http的时候会⾃动跳转到https上⾯。

server {listen 80;server_name www.域名.com;rewrite ^(.*)$ https://${server_name}$1 permanent;}server {listen 443;server_name www.域名.com;root /home/wwwroot;ssl on;ssl_certificate /etc/nginx/certs/server.crt;ssl_certificate_key /etc/nginx/certs/server.key;....}备注: ${server_name}可以换成$host⼆、重启nginx。

三、⽰例(以下是我们⽣产的配置)server {listen 80;server_name ;rewrite ^(.*)$ https://${server_name}$1 permanent;}server {listen 443;server_name ;ssl on;ssl_certificate /etc/pki/CA/certs/214321311540956.pem;ssl_certificate_key /etc/pki/CA/certs/214321311540956.key;ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;index index.php index.htm index.html;error_page 404 /404.html;error_page 500502503504 /50x.html;location ~ \.php {root /alidata/www/html;fastcgi_pass unix:/tmp/php-cgi.sock;fastcgi_index index.php;include fastcgi.conf;set $path_info "";set $fastcgi_script_name_new $fastcgi_script_name;if ($fastcgi_script_name ~* "^(.+\.php)(/.+)$" ) {set $fastcgi_script_name_new $1;set $path_info $2;}fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name_new;fastcgi_param SCRIPT_NAME $fastcgi_script_name_new;fastcgi_param PATH_INFO $path_info;}location / {root /alidata/www/html;index index.php index.html index.htm;if (!-e $request_filename){rewrite ^(.*)$ /index.php$1 last; }}}。

Nginx 服务(重写 重定向 防盗链)

Nginx 服务(重写  重定向  防盗链)

Nginx 服务重写重定向防盗链1.转向同一目录:server {listen 80; #监听80端口server_name ;index index.html index.php;root /opt/nginx/html;if ($http_host ~ "^www\.china\.com$"){rewrite /(.*) last;}}2.302重定向:server {listen 80;server_name ;if ($http_host != ""){rewrite ^/(.*) /$1 permanent;}3.301重定向:server {listen 80;server_name ;if ($http_host != ""){rewrite ^/(.*) /$1 redirect;}4.防盗链(返回412错误)1)服务器配置文件设置:location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip)$ {valid_referers none blocked ;if ($invalid_referer){# rewrite ^/ /a.gif;return 412;break;}access_log off; #关闭日志root /opt/nginx/html; # rootexpires 3d; #3天自动清除缓存break; #中止rewrite不继续匹配}服务器上放置一张a.png的图片2)客户访问中插入一个图片超链接:<html><head><title>Welcome to nginx!</title></head><body bgcolor="white" text="black"><center><h1>Welcome to nginx!</h1><h1> This is the desktop233</h1><a href="/a.png" >showpng</a> #链接到服务器上的图片</center></body></html>3)客户机启动nginx服务,访问自己的页面点击showpng链接。

nginx alias用法

nginx alias用法

nginx alias用法Nginx是一个流行的Web服务器软件,在构建Web应用和提供文件服务时经常被使用。

其中一个重要的功能是alias(别名)指令,用于创建URL的重定向或者重写请求路径。

在本文中,我们将探讨如何使用Nginx的alias指令。

首先,我们需要了解alias指令的基本语法和用法。

在Nginx配置文件中,alias 指令的语法如下:location /path/ {alias /real/path/;}这里的`/path/`是我们想要重定向或重写的URL路径,而`/real/path/`则是真正的文件路径。

当一个请求匹配到`/path/`时,Nginx会将请求路径替换为`/real/path/`,并将该请求转发到新的文件路径。

例如,如果我们希望将`/images/`重定向到`/var/www/images/`目录下的文件,我们可以这样配置:location /images/ {alias /var/www/images/;}在上述配置中,当一个请求匹配到`/images/`时,Nginx会将请求路径替换为`/var/www/images/`,然后将请求转发到新的文件路径。

除了基本的alias指令,Nginx还提供了一些特殊字符和变量,可以在alias路径中进行使用。

这些特殊字符包括`request_uri`,`document_root`和`realpath_root`等。

下面我们将详细介绍这些变量的用途。

1. request_uri:该变量包含整个请求的URI,包括查询字符串。

例如,如果我们的请求路径是`/images/demo.jpg?width=200&height=300`,那么request_uri的值就是`/images/demo.jpg?width=200&height=300`。

我们可以使用这个变量来创建具有动态特性的alias路径。

location /images/ {alias /var/wwwrequest_uri;}在上述示例中,如果请求路径是`/images/demo.jpg?width=200&height=300`,Nginx会将其转发到`/var/www/images/demo.jpg?width=200&height=300`。

nginx map 用法

nginx map 用法

nginx map 用法Nginx是一个高性能的Web服务器和反向代理服务器,它具有强大的功能和灵活的配置选项。

其中一个非常有用的功能是Nginx Map。

Nginx Map允许你在配置文件中定义变量,并根据特定的规则对这些变量进行映射。

它可以帮助你实现多种功能,包括重定向、访问控制、负载均衡等。

在本篇文章中,我们将详细介绍Nginx Map的用法并举例说明。

Nginx Map的基本语法如下:```map $variable $new_variable {pattern value;...}```在上面的示例中,`$variable`是源变量,`$new_variable`是目标变量。

`pattern`是源变量的取值范围,`value`是目标变量的值。

可以定义多个`pattern value`对,它们之间用分号`;`进行分隔。

下面是一个简单的例子,用于演示Nginx Map的基本用法:```map $http_user_agent $is_mobile_device {default no;~*mobile yes;}在上述例子中,我们定义了一个叫做`$is_mobile_device`的变量,它根据用户代理(`$http_user_agent`)的值进行映射。

如果用户代理中包含"mobile"一词(不区分大小写),那么`$is_mobile_device`的值将为"yes";否则,`$is_mobile_device`的值将为"no"。

使用Nginx Map时,可以根据业务需求进行复杂的映射操作。

以下是一些常用的用法示例:1. 重定向规则:根据用户请求的URL地址进行重定向。

```map $uri $redirect_url {/old-page.html /new-page.html;/old-page2.html /new-page2.html;default "";}server {...location / {if ($redirect_url) {return 301 $redirect_url;}...}```在上述示例中,我们定义了一个名为`$redirect_url`的变量,它根据请求路径(`$uri`)进行映射。

detours nginx 的函数 -回复

detours nginx 的函数 -回复

detours nginx 的函数-回复nginx是一个轻量级的Web服务器软件,它具有高性能、高并发处理能力和低资源消耗等特点,在Web服务器领域有着广泛的应用。

在nginx 中,detours函数是一个非常重要的函数,它主要用于实现URL重定向和请求转发等功能。

本文将以detours函数为主题,详细介绍它的作用、实现原理和使用方法。

首先,我们需要明确detours函数的作用。

在nginx中,detours函数主要用于实现URL重定向和请求转发。

URL重定向是指将一个URL请求重定向到另一个URL地址,而不是返回原请求的内容。

请求转发是指将一个URL请求发送到另一个服务器进行处理,然后将处理结果返回给客户端。

detours函数可以通过修改请求头部信息来实现URL重定向和请求转发的功能。

detours函数的实现原理比较复杂,需要对nginx的内部逻辑有一定的了解。

detours函数是在接收到请求后,nginx将请求传递给后端的处理函数之前被调用的。

在这个过程中,detours函数可以修改请求头部信息,包括URL地址、HTTP方法、请求数据等。

通过修改这些信息,detours 函数可以实现URL重定向和请求转发的功能。

具体来说,detours函数可以通过调用nginx提供的一些API来实现URL 重定向和请求转发。

例如,可以通过调用ngx_http_internal_redirect函数来实现URL重定向,它会修改请求的URL地址并将请求重新发送给nginx进行处理。

而对于请求转发,可以通过调用ngx_http_proxy_connect函数来实现,它会将请求转发到指定的后端服务器进行处理,并将处理结果返回给客户端。

除了实现URL重定向和请求转发的功能,detours函数还可以实现一些其他的操作。

例如,可以通过调用ngx_http_send_header函数来修改响应头部信息,例如设置响应状态码、设置响应内容的类型等。

nginx服务器中的rewrite规则

nginx服务器中的rewrite规则

nginx服务器中的rewrite规则在nginx服务器中,rewrite规则用于重新定向URL请求或修改请求的路径。

它允许将某个URL重定向到另一个URL,或者修改请求的路径以匹配服务器上的不同文件。

下面是一些nginx服务器中的rewrite规则示例:1. 重定向请求到另一个URL:```nginxrewrite ^/old-url$ /new-url permanent;```该规则将所有对/old-url的请求重定向到/new-url,并使用永久重定向(301状态码)。

2. 修改请求路径:```nginxrewrite ^/old-path/(.*)$ /new-path/$1 last;```该规则将所有以/old-path/开头的请求路径修改为以/new-path/开头,并保留其他请求路径不变。

3. 使用正则表达式匹配请求路径:```nginxrewrite ^/product/(.*)$ /item/$1 break;```该规则将所有以/product/开头的请求路径修改为以/item/开头,并继续处理其他nginx规则。

4. 避免循环重定向:```nginxlocation /old-url {rewrite ^/old-url$ /new-url redirect;}```在一个特定的location块中,可以使用'break'、'last'或'redirect'来避免循环重定向。

这些只是nginx服务器中rewrite规则的一些示例。

根据具体需求,可以结合不同的正则表达式和修饰符来创建适用于自己应用的rewrite规则。

使用Nginx对百度蜘蛛的301重定向跳转处理

使用Nginx对百度蜘蛛的301重定向跳转处理

使⽤Nginx对百度蜘蛛的301重定向跳转处理先简单说下我碰到的情况。

我⼀个域名的http页⾯被墙,国内⽤户可以通过https⽅式打开。

为了seo,也遵循尽量不换⽹站域名的前提下,现在我想实现的⽬标是对国外蜘蛛(google...)和不在墙内的⽤户访问http页⾯时301重定向跳转到https,⽽百度蜘蛛访问原页⾯时301到⼀个新域名,新域名反向代理原来的⽹页,⽤户通过百度搜索点击打开的是原域名https页⾯。

1、修改原域名nginx配置server {listen 80 default;server_name ;index index.html index.htm index. default.html default.htm default.php;root /home/wwwroot/nbhao;#通过$http_user_agent判断是否是百度蜘蛛if ($http_user_agent ~* Baiduspider){return 301 $request_uri;}#排除对⼀个⽹址的301重定向if ($request_uri !~ ^/.*/.*notify_url\.php.*){return 301 https://$server_name$request_uri;}location ~ .*\.(php|php5)?${try_files $uri =404;fastcgi_pass unix:/tmp/php-cgi.sock;fastcgi_index index.php;include fcgi.conf;}access_log /home/wwwlogs/.log ;}server {listen 443 ;......#https配置详见/1835.html}2、修改新域名配置server{listen 80;#listen [::]:80;server_name ;index index.html index.htm index.php default.html default.htm default.php;root /home/wwwroot//www;#如果⽤户不是百度蜘蛛且访问的⽹址不是baidu.*\.html格式set $flag 0;if ($http_user_agent !~* Baiduspider){set $flag "${flag}1";}#⽤做百度站长平台的验证if ($request_uri !~ ^.*/baidu.*\.html.*){set $flag "${flag}2";}if ($flag = "012") {return 301 https://$request_uri;}#接上不,如果是百度蜘蛛,执⾏_pass反代。

nginx return用法

nginx return用法

nginx return用法nginx的return指令用于指定Nginx在处理请求时的返回值,它可以控制Nginx返回给客户端的HTTP响应码,以及其他一些与HTTP响应相关的参数。

下面是关于Nginx return指令的一些常见用法和相关参考内容。

1. 结合特定的条件进行重定向:return指令可以根据特定条件来进行重定向,例如根据请求的URI或者HTTP请求头。

以下是一个示例:```location /old-url {return 301 /new-url;}```2. 返回指定的状态码:可以使用return指令来指定返回给客户端的HTTP状态码,例如:```return 404;```这个例子会返回给客户端一个404 Not Found的错误页面。

3. 结合rewrite指令进行重定向:可以使用return指令配合rewrite指令来完成URL重定向的任务。

例如:```location /old-url {rewrite ^/old-url/new-url permanent;}```这个例子会将所有以/old-url开头的请求重定向到/new-url。

4. 返回指定的HTTP响应体:除了返回指定的状态码之外,return指令还可以返回自定义的HTTP响应体,例如:```return 200 "Custom Response Body";```这个例子返回给客户端一个200 OK的状态码,以及自定义的响应体"Custom Response Body"。

5. 结合if指令进行条件判断:可以结合if指令在return指令中进行条件判断,根据if指令的判断结果返回不同的HTTP响应。

以下是一个示例:```location /sample-url {if ($arg_param = "value") {return 200 "Parameter value is value";}return 404;}```这个例子会根据请求中的参数值来返回不同的HTTP响应。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

详解Nginx中的重定向功能
nginx 各参数翻译,作用
$arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。

$args #这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah;
$binary_remote_addr #二进制的客户地址。

$body_bytes_sent #响应时送出的body字节数数量。

即使连接中断,这个数据也是精确的。

$content_length #请求头中的Content-length字段。

$content_type #请求头中的Content-Type字段。

$cookie_COOKIE #cookie COOKIE变量的值
$document_root #当前请求在root指令中指定的值。

$document_uri #与$uri相同。

$host #请求主机头字段,否则为服务器名称。

$hostname #Set to the machine's hostname as returned by gethostname
$http_HEADER
$is_args #如果有$args参数,这个变量等于”?”,否则等于”',空值。

$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。

$query_string #与$args相同。

$request_body_file #客户端请求主体信息的临时文件名。

$request_method #客户端请求的动作,通常为GET或POST。

$remote_addr #客户端的IP地址。

$remote_port #客户端的端口。

$remote_user #已经经过Auth Basic Module验证的用户名。

$request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。

$request_method #GET或POST
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。

$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

不能修改。

$scheme #HTTP方法(如http,https)。

$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。

$server_name #服务器名称。

$server_port #请求到达服务器的端口号。

$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

该值有可能和$request_uri 不一致。

$request_uri是浏览器发过来的值。

该值是rewrite后的值。

例如做了internal redirects后。

今天在给某网站写rewrite重定向规则时,碰到了这个关于重定向的参数处理问题。

默认的情况下,Nginx在进行rewrite后都会自动添加上旧地址中的参数部分,而这对于重定向到的新地址来说可能是多余。

虽然这也不会对重定向的结果造成多少影响,但当你注意到新地址中包含有多余的“?xxx=xxx”时,心里总还是会觉得不爽。

那么该如何来处理这部分的内容呢?看了下面两个简单的例子你就会明白了。

例如:
把/test.php?para=xxx 重定向到 /new
若按照默认的写法:rewrite ^/test.php(.*) /new permanent;
重定向后的结果是:/new?para=xxx
如果改写成:rewrite ^/test.php(.*) /new? permanent;
那结果就是:/new
所以,关键点就在于“?”这个尾缀。

假如又想保留某个特定的参数,那又该如何呢?可以利用Nginx本身就带有的$arg_PARAMETER参数来实现。

例如:
把/test.php?para=xxx&p=xx 重写向到 /new?p=xx
可以写成:rewrite ^/test.php /new?p=$arg_p? permanent;
只求结果的朋友可以直接忽略前面的内容,看这里:
•rewrite ^/test.php /new permanent; //重写向带参数的地址
•rewrite ^/test.php /new? permanent; //重定向后不带参数
•rewrite ^/test.php /new?id=$arg_id? permanent; //重定向后带指定的参数
permanent是永久重定向参数,根据需要去掉也可以,不过最好是带有。

首先Apache的Rewite规则差别不是很大,但是Nginx的Rewrite 规则比Apache的简单灵活多了
Nginx可以用if进行条件匹配,语法规则类似C
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
Rewrite的Flags
last - 完成重写指令后,搜索相应的URI和位置。

相当于Apache 里的[L]标记,表示完成rewrite,不再匹配后面的规则。

break - 中止Rewirte,不在继续匹配。

redirect - 返回临时重定向的HTTP状态302。

permanent - 返回永久重定向的HTTP状态301。

ZEND Framework的重定向规则:
案例一:
全部重定向到 /index.php
rewrite ^/(.*) /index.php?$1&;
案例二:
如果文件或目录不存在则重定向到index.php
if (!-e $request_filename) {
rewrite ^/(.*) /index.php?$1&;
}
WordPress的重定向规则:
案例一:
/12 重定向到 /index.php?p=12
if (!-e $request_filename) {
rewrite ^/(. )$ /index.php?p=$1 last;
}
案例二:
与zendframework配置很像
if (!-e $request_filename) {
rewrite ^/(.*) /index.php?$1&;
}
以下为Discuz完整的Rewrite for Nginx规则
if (!-f $request_filename) {
rewrite ^/archiver/((fid|tid)-[\w\-] \.html)$ /archiver/index.php?$1 last;
rewrite ^/forum-([0-9] )-([0-9] )\.html$ /forumdisplay.php?fid=$1&page=$2 last;
rewrite ^/thread-([0-9] )-([0-9] )-([0-
9] )\.html$ /viewthread.php?tid=$1&extra=page=$3&page=$2 last;
rewrite ^/space-(username|uid)-(. )\.html$ /space.php?$1=$2 last;rewrite ^/tag-(. )\.html$ /tag.php?name=$1 last;
}
文件及目录匹配,其中:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
正则表达式全部符号解释
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~* 分别为区分大小写不匹配及不区分大小写不匹配
(pattern) 匹配 pattern 并获取这一匹配。

所获取的匹配可以从产生的 Matches 集合得到,在VBScript. 中使用 SubMatches 集合,在JScript. 中则使用$0…$9 属性。

要匹配圆括号字符,请使用‘\(' 或‘\)'。

^ 匹配输入字符串的开始位置。

$ 匹配输入字符串的结束位置。

相关文档
最新文档