我在回答其他问题时遇到了一个问题(NGINX 反向代理重写规则与 proxy_redirect)
现在我想实现以下目标。“https://mydemo.app.de/test1/", "https://mydemo.app.de/test2/" 或 "https://mydemo.app.de/test3/“应该全部重写(而不是重定向)为“http://mydemo.app.local/target/“因此基本上输入 test1、2 或 3 的用户应该可以从目标获取内容而无需更改 URL。
我已经实现了这个功能,但没有 OR 条件。这是我的工作配置。
location ~* /test1 {
rewrite (?i)/test1(.*) /target$1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_pass http://mydemo.app.local;
# The location header in the servers response sometimes contains "ReturnURL=xyz" at the end. Therefore we need to catch and rewrite this occurance twice.
proxy_redirect ~*(.*)/target/(.*)target(.*)$ https://mydemo.app.de/test1/$2/test1/$3;
#This rule only gets used if there is no "ReturnURL=xyz" at the end of the location header in the servers response
proxy_redirect ~*(.*)/target/(.*)$ https://mydemo.app.de/test1/$2;
这是我目前想到的。
location ~* /(?<systemname>(test1|test2|test3)) {
rewrite (?i)/$systemname(.*) /target$1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_pass http://mydemo.app.local;
# The location header in the servers response sometimes contains "ReturnURL=xyz" at the end. Therefore we need to catch and rewrite this occurance twice.
proxy_redirect ~*(.*)/target/(.*)target(.*)$ https://mydemo.app.de/$systemname/$2/$systemname/$3;
#This rule only gets used if there is no "ReturnURL=xyz" at the end of the location header in the servers response
proxy_redirect ~*(.*)/target/(.*)$ https://mydemo.app.de/$systemname/$2;
proxy_pass_header Server;
但不幸的是,结果却是http://mydemo.app.local/test1代替http://mydemo.app.local/target
我试图减少这里的代码行数。我可以使用 3 个位置,但 95% 的位置都是相同的代码。这只会破坏我的配置文件。
我已经束手无策了。希望有人能给我一些启发。先行致谢。
答案1
您不能在正则表达式模式中使用变量,所有正则表达式模式都在 nginx 启动时编译,尽管您可以自由地在要匹配某些正则表达式模式的字符串中使用变量。这意味着$systemname
当您使用
rewrite (?i)/$systemname(.*) /target$1 break;
您的变量和变量location ~* /(?<systemname>(test1|test2|test3)) { ... }
都会被填充,因此只需使用就足够了。如果您希望名称只出现在 URI 的开头,则可以使用$systemname
$1
location ~* /(?<systemname>test1|test2|test3) { ... }
(test1|test2|test3)
location ~* ^/(?<systemname>test1|test2|test3)(?<route>.*) {
rewrite ^ /target$route break;
...
}
因为此位置无法捕获其他请求。