NGINX 正则表达式位置的重写语法是什么?
What's the rewrite syntax for an NGINX regex location?
在 10.1.2.15:9002
上使用 NGINX 作为负载平衡器 运行,我需要将 http://10.1.2.15:9002/proxy.stream?opt=1
重写为 http://10.1.2.15:9002/app/proxy.stream?opt=1
。
以下是我的 nginx.conf 文件中的内容:
http {
upstream app_cluster {
server 10.1.2.23:8080;
server 10.1.2.25:8080;
}
server {
listen 9002 default_server;
location /app/ {
proxy_pass http://app_cluster/;
}
location ~ ^/proxy.stream(.*)$ {
rewrite ^(.*)$ /app/$request_uri last;
}
}
}
顺便说一下,我可以用 return 401
替换 rewrite
行(例如),我可以看到使用 Chrome 开发者工具返回的 401 HTTP 状态,所以我知道正则表达式匹配。我只是无法正确重写 URI。事实上,我在 Developer Tools 中只看到状态为 406 的原始请求,所以我怀疑我的 rewrite
语法有问题。
有人看到这个配置有什么问题吗?
使用正则表达式中的匹配部分而不是 $request_uri
rewrite ^(.*)$ /app/ last;
在 rewrite
语句的 replacement 字符串中使用 $request_uri
是有问题的,因为它没有被规范化并且还包含查询字符串,这默认情况下,rewrite
将再次追加。
此外,您的 替换 字符串包含 //
,因为您附加的 URI 已经具有前导 /
.
正则表达式 location
不是必需的,因为前缀或完全匹配 location
就足够了,并且对于 nginx
更有效处理。有关更多信息,请参阅 this document。
例如:
location /proxy.stream {
rewrite ^ /app$uri last;
}
在 10.1.2.15:9002
上使用 NGINX 作为负载平衡器 运行,我需要将 http://10.1.2.15:9002/proxy.stream?opt=1
重写为 http://10.1.2.15:9002/app/proxy.stream?opt=1
。
以下是我的 nginx.conf 文件中的内容:
http {
upstream app_cluster {
server 10.1.2.23:8080;
server 10.1.2.25:8080;
}
server {
listen 9002 default_server;
location /app/ {
proxy_pass http://app_cluster/;
}
location ~ ^/proxy.stream(.*)$ {
rewrite ^(.*)$ /app/$request_uri last;
}
}
}
顺便说一下,我可以用 return 401
替换 rewrite
行(例如),我可以看到使用 Chrome 开发者工具返回的 401 HTTP 状态,所以我知道正则表达式匹配。我只是无法正确重写 URI。事实上,我在 Developer Tools 中只看到状态为 406 的原始请求,所以我怀疑我的 rewrite
语法有问题。
有人看到这个配置有什么问题吗?
使用正则表达式中的匹配部分而不是 $request_uri
rewrite ^(.*)$ /app/ last;
在 rewrite
语句的 replacement 字符串中使用 $request_uri
是有问题的,因为它没有被规范化并且还包含查询字符串,这默认情况下,rewrite
将再次追加。
此外,您的 替换 字符串包含 //
,因为您附加的 URI 已经具有前导 /
.
正则表达式 location
不是必需的,因为前缀或完全匹配 location
就足够了,并且对于 nginx
更有效处理。有关更多信息,请参阅 this document。
例如:
location /proxy.stream {
rewrite ^ /app$uri last;
}