[分享]apache rewrite转nginx经验

2016-01-29PHP4338

123.jpg

找到一个好工具,非常简单的就把apache的htaccess转到了nginx下面,转换后的代码放在 location / 里边。

工具的地址是:

http://www.anilcetin.com/convert-apache-htaccess-to-nginx/


或者百度 搜索"Apache Rewrite 转 Nginx Rewrite",自行转换。


之后需要修改配置文件,加入

location / {

此处放自动转换后的nginx伪静态规则

}

你也可以把那段代码存为一个conf文件,然后通过include调用


apache rewrite转nginx经验–对大括号的支持

在nginx中这样写规则rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;是无法启动的,解决的办法是加上两个双引号rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;这样就OK了,应该可以说是完全兼容apache的语法的,只需要改下RewriteRule为Rewrite,后面的一般可以这样对应改

[R] -> redirect;

[P] -> last;

[R,L] -> redirect;

[P,L] -> last;

[PT,L] -> last;

nginx rewrite中支持4种类型的转向:跳转型的redirect:302跳转到rewrite后的地址permanent:301永久定向到rewrite后的地址,对搜索引擎更友好

代理型的

last:重新将rewrite后的地址在server标签中执行

break:将rewrite后的地址在当前location标签中执行


在实际配置中,有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是这样的。


#location / {

#proxy_pass http://test;

#alias /home/html/;

#root /home/html;

#rewrite "^/a/(.*)\.html$" /1.html last;

#}


在#location / { 配置里:


1、使用root指定源:使用last和break都可以


2、使用proxy_pass指定源:使用last和break都可以


3、使用alias指定源:必须使用last


在location /a/或使用正则的location ~ ^/a/里:


1、使用root指定源:使用last和break都可以


2、使用proxy_pass指定源:使用break和last结果有所区别


3、使用alias指定源:必须使用last


其中区别主要在proxy_pass这个标签上,再看看几个测试结果:


location / {

root /home/html;

}


location /a/ {

proxy_pass http://test;

rewrite "^/a/(.*)\.html$" /1.html last;

}


在这段配置里,使用last访问是可以访问到东西的,不过,它出来的结果是:/home/html/1.html;可我需要的是http://test/1.html?使用break就可以了。


location / {

root /home/html;

}


location /a/ {

proxy_pass http://test;

rewrite "^/a/(.*)\.html$" /a/1.html last;

}


在这段配置里,返回错误,因为last会重新发起请求匹配,所以造成了一个死循环,使用break就可以访问到http://test/a/1.html。


所以,使用last会对server标签重新发起请求,而break就直接使用当前的location中的数据源来访问,要视情况加以使用。一般在非根的location中配置rewrite,都是用的break;而根的location使用last比较好,因为如果配置了fastcgi或代理访问jsp文件的话,在根location下用break是访问不到。测试到rewrite有问题的时候,也不妨把这两者换换试试。


至于使用alias时为什么必须用last,估计是nginx本身就限定了的,怎么尝试break都不能成功。

  • 相关文章
  • 查看评论:(0)
【已经有0位大神发现了看法】

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信