微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 htaccess 规则转换为 nginx 服务器块

如何解决将 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 举报,一经查实,本站将立刻删除。