1

我正在努力改变

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

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

我通常对 Nginx 非常满意,它设置了几个站点并在过去做了一些工作。这是我在 conf vhost 中的 URL 重写 - 我尝试替换breaklast但没有运气。

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

3 回答 3

2

您声明中的美元符号不属于那里。美元符号表示字符串的结尾。因此,一场成功的比赛不会有任何结果。对于其余部分,您的重写是正确的,您可以忽略 jagsler 关于无法找到 php 语句的评论。这是不正确的,因为文档清楚地涵盖了,最后一个指令将指示 nginx 搜索要匹配的新位置。由于该语句将 URL 重写到与它所在的位置块不匹配的不同位置,因此也没有机会循环。

于 2012-12-18T07:39:17.677 回答
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 的位置块。

Another modifier is the "break", wich means if the rewrite condition equals true then rewrite the requested uri BUT DO NOT JUMP, instead stay in the same location block and continue to the next line inside the block

于 2015-07-08T00:03:10.520 回答
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;
}
于 2012-12-16T23:19:03.980 回答