当参数前有斜杠时,nginx 会重定向而不是重写

当参数前有斜杠时,nginx 会重定向而不是重写

我有以下位置块,作为 CMS 复杂路由的一部分:

    location @mylocation {

        if (-d $request_filename) {
            rewrite ^/(.*)$ /$controller/$siteName last;
            break;
        }

        if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
          rewrite ^/(.*)$ /$controller/$siteName/$1 last;
        }

    }

$controller类似于“index.php”并且$siteName是标识 cms 中特定站点的哈希值。

它运行良好,nginx 重写http://www.mydomain/path?somearg=somethinghttp://www.mydomain/index.php/HASH/path?somearg=something

但是当我有这样的 url 时,http://www.mydomain/path/?somearg=somethingnginx 会重定向(301)到http://www.mydomain/index.php/HASH/path?somearg=something,并且 index.php 和 HASH 就会暴露。

我尝试了这样的事情:

    location @mylocation {

        if (-d $request_filename) {
            rewrite ^/(.*)$ /$controller/$siteName last;
            break;
        }

        if ($request_filename ~ "") {
            #not sure what to put here
        }


        if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
          rewrite ^/(.*)$ /$controller/$siteName/$1 last;
        }

    }

但我不确定在第二个 if 块中要放什么才能避免重定向。

任何帮助都将不胜感激,谢谢。

答案1

你确定不是 CMS 生成重定向吗?你的配置或 nginx 的工作方式都不会生成此类响应。

让我们尝试删除尾随斜杠(如果存在),看看是否能安抚 CMS 触发重定向?

if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
  rewrite ^/(.*?)/?$ /$controller/$siteName/$1 last;
}

相关内容