如何解决将 htaccess 规则转换为 nginx 服务器块
我在主根文件夹内的文件夹 /rest-api 的 .htaccess 文件中有以下代码。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\?*$ /rest-api/index.PHP?__route__=/$1 [L,QSA]
所以,我需要将它迁移到 Nginx 服务器块中,我正在尝试多个选项,但没有任何效果。我发现的最佳方法是:
location /rest-api {
if (!-e $request_filename){
rewrite ^/(.*)\?*$ /index.PHP?__route__=/$1;
}
}
但是当它应该转换 url 时它会下载一个文件。任何人都可以帮助我吗?谢谢!!
解决方法
我认为您的正则表达式已损坏,其作者的意思是 ^(.*)\?.*$
并希望保留没有查询字符串的 URI 部分。 NGINX 使用没有查询字符串部分的规范化 URI,所以你可以试试这个:
location /rest-api {
try_files $uri $uri/ /rest-api/index.php?__route__=$uri&$args;
}
上述配置的唯一警告是,如果 HTTP 请求根本没有任何查询参数,它将传递额外的 &
。通常它不会导致任何麻烦,但如果是,一些更准确的配置版本是
location /rest-api {
set $qsa '';
if ($args) {
set $qsa '&';
}
try_files $uri $uri/ /rest-api/index.php?__route__=$uri$qsa$args;
}
更新
我对 Apache mod_rewrite 不是很熟悉,但是如果您需要使用不带 /rest-api
前缀的 URI 部分作为 __route__
查询参数,请尝试以下操作:
location = /rest-api {
# /rest-api to /rest-api/ redirect is for safety of the next location block
rewrite ^ /rest-api/ permanent;
}
location /rest-api/ {
set $qsa '';
if ($args) { set $qsa $args; }
rewrite ^/rest-api(.*)$ $1 break;
try_files /rest-api$uri /rest-api$uri/ /rest-api/index.php?__route__=$uri$qsa$args;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。