Apache 到 Nginx 重写非资产匹配子字符串

Apache to Nginx rewrite for non assets matching a substring

我有以下 Apache 重写条件,只是无法弄清楚将其转换为 Nginx 重写的正确方法。

RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5})$

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_URI} ^/(site|search|members|P[0-9]{2,8}) [NC]

RewriteRule ^(.*)$ /index.php?/ [L]

编辑: 事实证明,页面下方的一条规则劫持了我之前的规则。 有问题的规则是这个:

if (!-d $request_filename) {
    rewrite ^/(.+)/$ / permanent;
}

您应该将两个 REQUEST_URI 条件组合成一个正则表达式,并将其用作位置说明符。然后在内部位置检查文件是否存在。

location ~ ^\/(site|search|members|P[0-9]{2,8})(?!(\.[a-zA-Z0-9]{1,5}$)) {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?/ break;
    }
    # here goes something like 'root ..' for getting existent file
}

这应该可以解决问题。

# nginx configuration
location ~ "(\.[a-zA-Z0-9]{1,5})$" {
}
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?/ break;
}
}

希望这对您有所帮助 :)