nginx 重写 url 遗漏了一些东西

nginx rewrite url missing something

我的根目录下有多个动态url,需要这样写。例如

https://mv.test/review/4
https://mv.test/investment-banker/banking-products--004

1st url /Reviews/ 运行良好,但 2nd url 将转到 404 页。我不明白为什么它不起作用。

位置块

location / {
    try_files $uri $uri.html $uri/ @extensionless-php;
}
location @extensionless-php {
    rewrite ^(.*)$ .php last;
}

location /review/ {
    rewrite "^/review/([0-9]+)$" /review.php?id= last;
}
location /store/ {
    rewrite "^/(.*)/(.*)$" /store.php?store_type=&store_owner= last;
}

很明显https://example.com/investment-banker/banking-products--004不匹配location /store/,所以会默认location处理,即location /.

您想将 https://foo/bar 重写为 /store.php?store_type=foo&store_owner=bar,因为 foo/bar 与服务器已处理的另一个合法 URI 不匹配。

目前 location @extensionless-php 块将盲目地将 URL 重写为 /foo/bar.php 无论 PHP 文件是否存在。

这可以通过 if 块来改进。

例如:

location / {
    try_files $uri $uri.html $uri/ @extensionless-php;
}
location @extensionless-php {
    if (-f $document_root$uri.php) {
        rewrite ^(.*)$ .php last;
    }
    rewrite ^/([^/]+)/([^/]+)$ /store.php?store_type=&store_owner= last;
}    
location /review/ {
    rewrite ^/review/([0-9]+)$ /review.php?id= last;
}