Nginx,重写多个子文件夹

时间:2014-09-04 12:28:55

标签: apache nginx rewrite

我尝试将我的服务器从Apache移到基于Nginx的设置。但是,我遇到了让我的htaccess Apache魔法的一部分在Nginx中工作的问题。

我想传输的.htaccess代码是:

RewriteRule ^([a-zA-Z0-9_]+)/$                  /index.php?page=$1 [L,QSA] 
RewriteRule ^([a-zA-Z0-9_]+).html$              /index.php?page=$1 [L,QSA] 
RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/.*/([a-zA-Z0-9_]+)$       /index.php?page=$1&id=$2&sub=$3 [L,QSA]
RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/.*$       /index.php?page=$1&id=$2 [L,QSA] 

我使用online converter给了我以下位置块:

location / {
rewrite ^/([a-zA-Z0-9_]+)/$ /index.php?page=$1 break;
rewrite ^/([a-zA-Z0-9_]+).html$ /index.php?page=$1 break;
rewrite ^/([a-zA-Z0-9_]+)/([0-9]+)/.*/([a-zA-Z0-9_]+)$ /index.php?page=$1&id=$2&sub=$3 break;
rewrite ^/([a-zA-Z0-9_]+)/([0-9]+)/.*$ /index.php?page=$1&id=$2 break;
}

可悲的是,我只能让一个位置重写一次工作(我把“最后一个”放在后面)。我似乎无法将多个子文件夹URL动态重写为单个PHP脚本的参数。

对此有何帮助? Nginx进行这种重写的方式是什么?我尝试使用几个位置用于不同的子文件夹,但我宁愿有一个通用的解决方案,无论什么url被抛出它都可以工作。

1 个答案:

答案 0 :(得分:2)

为每个规则使用不同的位置块:

location ~ ^/[a-zA-Z0-9_]+/$ {
    rewrite ^/([a-zA-Z0-9_]+)/$ /index.php?page=$1 last;
}

location ~ ^/[a-zA-Z0-9_]+.html$ {
    rewrite ^/([a-zA-Z0-9_]+).html$ /index.php?page=$1 last;
}

location ~ ^/[a-zA-Z0-9_]+/[0-9]+/.*/[a-zA-Z0-9_]+$ {
    rewrite ^/([a-zA-Z0-9_]+)/([0-9]+)/.*/([a-zA-Z0-9_]+)$ /index.php?page=$1&id=$2&sub=$3 last;
}

location ~ ^/[a-zA-Z0-9_]+/[0-9]+/.*$ {
    rewrite ^/([a-zA-Z0-9_]+)/([0-9]+)/.*$ /index.php?page=$1&id=$2 last;
}

location = /index.php {
    # your proxy rules here...
}

上面的重写规则使用 last 选项,nginx docs中说明了这一点:

last
    stops processing the current set of ngx_http_rewrite_module
    directives and starts a search for a new location matching the
    changed URI;