我已经在nginx中大量使用重写来执行这类事情:
/photos/123344 -> /photos/photos.php?id=123344
/photos/london-2016 -> /photos/photo-shoot.php?name=london-2016
目前我没有其他(非动态)网页的规则。 E.g
/photos/shoot-register.php -> /photos/shoot-register.php
我想成为
/photos/shoot-register.php -> /photos/shoot-register
但没有为每个.php文件指定单独的rewrite
规则。
try_files
似乎是正确的指令:
location ~ ^/photos {
try_files $uri $uri.php?$args;
rewrite ^/photos/([0-9]+)(/?)$ /photos/photo.php?id=$1;
rewrite ^/photos/([^/\.]+)(/?)$ /photos/photo-shoot.php?name=$1;
}
但这不起作用,除非我删除了两条重写行。
我认为这意味着在尝试文件后执行不会停止?它找到“shoot-register.php”但随后继续执行并最终得到/photos/photo-shoot.php?name=shoot-register.php
?
如何在try_files成功找到匹配后停止?
由于
答案 0 :(得分:2)
如果将重写移动到单独的命名位置,然后更改try_file指令以尝试该文件,然后更改php文件然后指向新位置,该怎么办?
location ~ ^/photos {
try_files $uri $uri.php?$args @rewrites;
}
location @rewrites {
rewrite ^/photos/([0-9]+)(/?)$ /photos/photo.php?id=$1;
rewrite ^/photos/([^/\.]+)(/?)$ /photos/photo-shoot.php?name=$1;
}