使用Nginx URL重写系统..简单,最后还是休息?

时间:2012-12-16 17:29:54

标签: url-rewriting nginx

我想改变

http://site.com/show_page.php?name=terms

http://site.com/pages/terms.html

我通常非常擅长Nginx设置了几个网站并且过去做了一些工作。这是我的网址重写,在conf vhost中 - 我尝试用break替换last,但没有运气。

location /pages {
    rewrite ^/pages/(.*)$.html /show_page.php?name=$1? break;
} 

3 个答案:

答案 0 :(得分:2)

您的陈述中的美元符号不属于那里。美元符号表示字符串的结尾。因此,在成功比赛之后没有任何事情可以发生。对于其余的你的重写是正确的,你可以忽略jagsler关于无法找到php语句的评论。文档清楚地说明这是不正确的,最后一条指令将指示nginx搜索匹配的新位置。由于语句将URL重写到与其所在的位置块不匹配的其他位置,因此也没有循环的可能性。

答案 1 :(得分:2)

jagsler回答没问题 但是必须牢记这一点:

server {
    # you config here (servername, port, etc.)

    location /pages {
        #***modified . = any character, so escape literal dots***
        rewrite ^/pages/(.*)\.html$ /show_page.php?name=$1? last;
        #***the line bellow will only be executed if the rewrite condition***
        #***equals false, this is due to the "last" modifier in the rewrite rule***
        include php.conf;
    } 

    # instead of the php location block also just add the include
    include php.conf;
}

请注意重写规则中修饰符的行为 "最后"表示如果重写条件等于true,则重写请求的uri并跳转到适合新重写的uri的位置块。

另一个修饰符是" break",这意味着如果重写条件等于true则重写请求的uri但不要跳转,而是保持在相同的位置块并继续到块内的下一行

答案 2 :(得分:0)

有两个原因它不起作用。首先,您的重写规则不正确,将其更改为:

rewrite ^/pages/(.*).html$ /show_page.php?name=$1? last;

第二个是当你像这样重写时,nginx不知道如何处理php文件,因为它永远不会到达location ~ \.php块。您可以通过将完整的location ~ \.php放在名为php.conf的其他文件(或任何您喜欢的文件)中并将其包含在您需要的服务器块中来解决此问题。

这可能看起来像:

server {
    # you config here (servername, port, etc.)

    location /pages {
        rewrite ^/pages/(.*).html$ /show_page.php?name=$1? last;
        include php.conf;
    } 

    # instead of the php location block also just add the include
    include php.conf;
}