我有这样的配置:
location ~ ^/myway(.*) {
rewrite ^/myway(.*)$ /anotherway$1;
rewrite_log on;
error_log /var/log/nginx/errors notice;
}
location /anotherway {
...
internal;
}
url:site.com/myway/
工作正常(重写为site.com/anotherway/
)。但是 url:site.com/myway
重定向到site.com/anotherway/
。为什么?它会给出 404 错误吗?
答案1
您可以更改(.*)
为(.+)
.*
匹配任意字符(换行符除外)量词:* 零次至无限次之间,尽可能多次,根据需要返回 [贪婪]
.+
匹配任意字符(换行符除外)量词:+ 一次到无限次之间,尽可能多次,根据需要返回 [贪婪]
这意味着:
/myway(.*)
匹配 /myway(...) & /myway/(...)/myway(.+)
仅匹配 /myway/(...)
如果指定的正则表达式与请求 URI 匹配,则 URI 将按照替换字符串中指定的方式进行更改。重写指令将按照其在配置文件中出现的顺序依次执行。可以使用标志终止对指令的进一步处理。如果替换字符串以“http://”或“https://”开头,则处理将停止并将重定向返回给客户端。
有关 Nginx 重写的更多信息:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
顺便说一下,您可以在这里测试正则表达式:https://regex101.com/
答案2
试试这个 - 我加了几个斜线。不能 100% 确定它是否有效,但值得一试。
location ~ ^/myway/(.*) {
rewrite ^/myway/(.*)$ /anotherway$1;
rewrite_log on;
error_log /var/log/nginx/errors notice;
}
它也可能与配置文件中某处的 try_files 相关。