rewrite可以根据您的条件将传入的URL更改(重写)到不一样的URL是任何Web服务器的基本功能。php
Nginx重写功能很是强大且灵活。html
咱们将在nginx重写中解释如下示例:linux
如下是nginx重写的语法:nginx
rewrite reg-ex replacement [flag];
在上面:正则表达式
在nginx中,能够在如下三个上下文中的任何一个内指定rewrite指令:server,location,ifcentos
如下是Nginx重写指令的示例:浏览器
rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html last;
例如:服务器
在上面的重写规则中:ide
虽然Nginx重写规则与Apache相似,但在如何在Nginx中编写重写规则方面仍存在不少差别。测试
使用重写,您能够将许多传入的原始URL路由到将为这些请求提供服务的主控制器模板。
如下重写示例解释了这一点。
rewrite ^/linux/(.*)$ /linux.php?www=$1 last;
在上面的示例中,当您调用abcgo.com/linux/centos URL时,它将使用上述规则进行重写,它将使用此重写的URL提供页面:abcgo.com/linux.php?www=centos
如上所示,任何与此处模式匹配的URL(即URL中的/linux/)都将由linux.php提供,但原始传入URL中的最后一部分将用做发行版中的参数的值。 linux.php控制器。
所以,上述重写规则将转换传入的URL,以下所示:
与前面的示例相似,咱们在替换字符串中使用$1来捕获reg-ex中第一个括号()内的任何内容。在这种状况下,这是原始传入URL的最后一部分。
咱们还使用此处的最后一个标志来指示nginx中止在当前块中搜索进一步的重写指令,并继续移动到下一个匹配位置以进行进一步搜索。
在这个例子中,咱们将重写条件放在location指令中。
在此示例中,location指令是/data/,它还匹配下面给出的替换字符串中的$1。
location /data/ { rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html break; return 403; }
若是你使用上面的“最后”标志会发生这种状况:
由于,咱们不但愿出现上述行为,咱们在这里使用了“break”做为标志,它将再次中止处理重写块。
要在位置上下文中有效使用重写指令,您须要了解位置如何工做的详细信息
若是替换字符串包含新请求参数,则先前的请求参数将附加在它们以后。若是您不想要此行为,请在替换字符串的末尾添加问号,以免添加它们。
在如下示例中,在替换字符串部分中,末尾没有问号。即$1后无问号
rewrite ^/linux/(.*)$ /linux.php?www=$1 last;
在上面的示例中,当替换字符串包含传入的请求参数时,以前请求的参数将附加在它们以后。
有时候,你可能不但愿这种状况发生。在那种状况下,使用?以下所示。
在下面的例子中,在Nginx重写的替换字符串部分中,咱们添加了?在末尾。即$1后有一个问号
rewrite ^/linux/(.*)$ /linux.php?www=$1? last;
在上面的示例中,替换字符串包含传入的请求参数,而后不会在它们以后附加前一个请求的参数。
如下几个示例说明咱们能够在if指令中使用重写。
您能够经过使用$scheme,$http_host,$http_user_agent等变量进行条件比较来进行条件重写,以下所示:
if ($scheme="http") { rewrite ^ https://www.abcgo.com$uri permanent; } if ($http_host=abcgo.com) { rewrite (.*) https://www.abcgo.com$1; } if ($http_user_agent=MSIE) { rewrite ^(.*)$ /pdf/$1 break; }
请注意,有更好的方法能够实现上述示例的最终结果。上面的例子只是为了代表咱们能够在nginx配置文件中的if语句中添加剧写指令。
请注意,您还能够在nginx配置文件中将如下两个参数的值设置为on或off:
server_name_in_redirect on port_in_redirect off
如下是您可使用的4种不一样的Nginx Rewrite指令标志。
last:此标志将中止处理当前集中的重写指令,并将从与更改的URL匹配的新位置开始。
rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html last;
break:该标志将中止处理当前集合中的重写指令。
rewrite ^(/data/.*)/html/(\w+)\.?.*$ $1/linux/$2.html break;
redirect: 此标志将使用302 HTTP代码执行临时重定向。这主要在替换字符串不是http,或https或$scheme时使用
permanent:此标志将使用301 HTTP代码执行永久重定向
rewrite ^ https://www.abcgo.com$uri permanent;
默认状况下,只要Nginx成功重写,它就不会将其记录在error.log中。
最初在编写复杂的重写规则时,您确实但愿确保Nginx根据您的要求进行重写。
为此,您应该启用重写日志,该日志将在nginx使用配置文件中的任何一个重写指令成功重写时随时写入日志条目。
为此,请使用rewrite_log指令并将其设置为on。
将如下两行添加到nginx default.conf中:
error_log /var/log/nginx/error.log notice; rewrite_log on;
在上面:
完成上述更改后,您将开始看到这样的行,这些行清楚地显示了在转换传入URL时使用了哪些特定的重写规则。这也将在日志条目中显示最终翻译的URL。
[notice] 14385#14385: *1 "^(/data/.*)/html/(\w+)\.?.*$" matches "/data/www/html/test", client: 192.168.199.2, server: localhost, request: "GET /data/www/html/test HTTP/1.1", host: "192.168.199.20" [notice] 14385#14385: *1 rewritten data: "/data/www/linux/test.html", args: "", client: 192.168.199.2, server: localhost, request: "GET /data/www/html/test HTTP/1.1", host: "192.168.199.20"
在上面:
“^(/data/.*)/geek/(\w+)\.?.*$”
/data/www/linux/test.html