Nginx的Rewrite配置

       wnmp 已经发布好几天了,参加试用的人也不少,不少人反映如何设置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

 

官方文档请点击这里

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以其良好的并发性能,目前正在逐渐取代Apache成为大家的Web server首选,但是Nginx目前的中文资料很少,需要大家努力贡献。

7 Responses to Nginx的Rewrite配置

  1. qingjiao says:

    你好!我如果要对具体的某几个文件缓存该如何写呢?
    这样写可以吗?
    location ~ .(a.txt|b.txt|c.html|d.jpg)$
    {
    expires 30d;
    }

    希望能给予答复,谢谢!

    licess Reply:

  2. linux says:

    server
    {
    listen 80;
    server_name http://www.xiaoyuan.com;

    location /{
    index index.html index.htm index.php;
    root /web/www;

    rewrite "^/test-([0-9]+)-([0-9]+).html$" /test.php?id=$1&page=$2
    last;
    }
    #limit_conn crawler 20;

    #location /status {
    #stub_status on;
    #access_log off;
    #}

    location ~ \.php$
    {
    include fastcgi_params;
    fastcgi_pass unix:/tmp/php-cgi.sock;
    #fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fcgi.conf;
    fastcgi_param SCRIPT_FILENAME /web/www$fastcgi_s
    cript_name;
    }

    看看我的配置,我想实现test.php?id=1 用test-1.html来显示,老是不成功呀

    licess Reply:

    @linux, rewrite ^/test-([0-9]+).html$ /test.php?id=$1 last;

  3. Pingback: 自动将Apache Rewrite伪静态规则转换为Nginx Rewrite - Licess's Blog

  4. Eirc says:

    下面的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;

    上面兩句一模一樣啊?

  5. 绿茶山庄 says:

    真是从哪都能搜到军哥的文章。。。学习了~

发表评论

(required)