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/348.html
《Nginx下WordPress的Rewrite》:http://www.ccvita.com/336.html
《Nginx的Rewrite配置》:http://www.ccvita.com/319.html
《Nginx的防盗链配置》:http://www.ccvita.com/312.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配置代码。
已经搞定!谢谢楼主的帮助!
博主你好,我有个很恼人的问题,百度、google千百次后都解决不了,可否帮忙看看是啥问题:
这样一个rewrite
rewrite ^/search/([^_/]*)\.htm$ /index.php?mod=search&w=$1 last;
原来在Apache下是正常工作的,但是将它移植到Nginx(v0.5.37)下后,对中文的url编码形式,如%E4%BC%91%E9%97%B2(休闲),会解析成%E4%BC%91%E9%A5%B9,即第一个字(休)都是正确的,但第一个字后面的就不正常了。
可否看看这是啥问题,已经有啥解决办法?谢过了。
您好:个人freebsd主机该如何配置?能否贴出完整文件?实验多次,均不成功。
@张长弓, freebsd中的Nginx的Rewrite配置应该也是一样的,我没有具体的实践过,没法回复你。
我有个问题啊 博主你一定要帮助一下我啊 我这里有一个规则不知道在nginx里面可以用不 你给我看一下吧
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule index\.php /index\.php
RewriteRule category/([0-9]+)/$ /plus/list.php?tid=$1
RewriteRule games/([0-9]+)/([0-9]+)/$ /plus/view.php?arcID=$1&pageno=$3
RewriteRule category/([0-9]+)/([0-9]+)/([0-9]+)/$ /plus/list.php?tid=$1&totalresult=$2&PageNo=$3
也可以说是apache下面的规则 能不能帮我转换一下 万分感谢啊
回复留言
水水语录
树上的苹果结了三个,妈妈说有一个是坏的,吃了会肚子疼
最新日志
分类列表
文章归档
关键词
Apache 媳妇 配置 感慨 PHP技术 MySQL Memcache 优化 PHP类 css PHP 迪拜 陈陈 调优 Linux 生活 MySQL优化 FireFox Discuz! Nginx 缓存 性能 Rewrite MooPHP框架 JavaScript WordPress插件 WordPress MySQL效率 风骚 生日 奇矩互动 负载 视频 blog程序 IE6 分析 yy 高负载 ZIP IE7 服务器 正则表达式 常用 防盗链 Cookie