我有以下位置块,作为 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=something
为http://www.mydomain/index.php/HASH/path?somearg=something
。
但是当我有这样的 url 时,http://www.mydomain/path/?somearg=something
nginx 会重定向(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;
}