在nginx位置块中使用try_files和重写

时间:2016-10-26 14:12:13

标签: nginx url-rewriting

我已经在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成功找到匹配后停止?

由于

1 个答案:

答案 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;
}