Nginx的Rewrite配置
Nginx的Rewrite
经过网上查阅和测试,发现Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用。比如在Apache中这样写规则
rewrite ^/([0-9]{5}).html$ /viewthread.php?tid=$1 last;
而在Nginx中写成这样写是无法启动的,解决的办法是加上两个双引号:
rewrite “^/([0-9]{5}).html$” /viewthread.php?tid=$1 last;
同时将RewriteRule为Rewrite,基本就实现了Nginx的Rewrite规则到Apache的Rewite规则的转换。
Rewrite的Flags
last - 基本上都用这个Flag。
break - 中止Rewirte,不在继续匹配
redirect - 返回临时重定向的HTTP状态302
permanent - 返回永久重定向的HTTP状态301
官方文档请点击这里,另外如果对于302,301这些状态有疑问的,可以参考《301 Redirect 永久重定向的实现》:http://www.ccvita.com/85.html
如果需要对Nginx配置防盗链的话,可以参考《Nginx的防盗链配置》:http://www.ccvita.com/312.html
Discuz!在Nginx下的Rewrite
需要说明的是,下网上以前一直流传的Rewrite都是有误的。
下面的Rewrite中百分号前面多了个转移字符“\”,这在Apache中是需要的,而在Nginx中则是不需要的。
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&extra=page\%3D$3&page=$2 last;
正确的应该是
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
这个错误在基本上目前所有使用Nginx作为服务器,并且开启了Rewrite的网站上存在。包括Discuz!官方,目前已经给cnteacher反馈了。
完整正确的Discuz!在Nginx下的Rewrite如下:
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%3D$3&page=$2 last;
rewrite ^/space-(username|uid)-(.+)\.html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+)\.html$ /tag.php?name=$1 last;
break;
相关文档:
《Nginx下Discuz!的Rewrite》:http://www.ccvita.com/319.html
《Nginx下WordPress的Rewrite》:http://www.ccvita.com/319.html
《Nginx的Rewrite配置》:http://www.ccvita.com/319.html
《Nginx的防盗链配置》:http://www.ccvita.com/319.html
第一楼。。。Oh yeah
那wordpress呢?
记下来备用
标记,说不定什么时候都用上了!
@Black-Xstar wordpress的URL Rewrite就比较麻烦了,得看你原来是使用的哪种配置方式。
比如你用www.ccvita.com/%post_id%/这种形式的就可以使用下面的rewrite规则
if (!-f $request_filename) {
rewrite ^(.*)$ /index.php?q=$1 last;
break;
}
然后reload下Nginx就可以了。
以上示例没有经过真实环境的测试。
看了半天才发现博主是原来dz的水水啊…
请教个问题,if那里,能否指定port呢。比如,我想指定,通过80端口访问logging.php的,一律给转到443端口去..
也就是https访问logging.php啦。
apache里面
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} !^/logging.php.*
RewriteRule ^/(.*)$ http://%{SERVER_NAME}/$1 [R,L]
就行了…nginx找了半天文档没找到SERVER_PORT的属性…
谢谢哈~
有些东西是不需要照着apache配置硬转的,先理解apache配置的意思,然后可以舍弃的就舍弃,只考虑必须要的部分
@nginx_fans 是啊,文章第一段就是提个通用的解决方案。
这样方便新手嘛~~
博主好啊,网上搜索 nginx 下关于 discuz 的 rewrite 一大堆方案,都不行。试用你的这个也不行。我把我的环境说一下:
我的网站是 http://www.test.com
discuz 运行在 http://www.test.com/bbs/
当前 server 配置为:
server {
listen 80;
server_name http://www.test.com test.com *.test.com;
location / {
root /data/www/test;
index index.htm index.html index.php;
}
location ~ .*\.php?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www/test$fastcgi_script_name;
include fastcgi_params;
}
}
根据你的方案,修改后为:
server {
listen 80;
server_name http://www.test.com test.com *.test.com;
location / {
root /data/www/test;
index index.htm index.html index.php;
}
location /bbs {
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%3D$3&page=$2 last;
rewrite ^/space-(username|uid)-(.+)\.html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+)\.html$ /tag.php?name=$1 last;
break;
}
location ~ .*\.php?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www/test$fastcgi_script_name;
include fastcgi_params;
}
}
结果发现不行,不知道哪里错了,请博主指教!
楼上的朋友,请查看http://www.ccvita.com/348.html这篇文文章,我贴了完整的Nginx配置代码。
已经搞定!谢谢楼主的帮助!