我想改变
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;
}
答案 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;
}