我有nginx location
指令,目的是从proxy_pass
指令的URI"删除"本地化前缀.
例如,要使URI http://example.com/en/lalala使用proxy_pass http://example.com/lalala
location ~ '^/(?<locale>[\w]{2})(/(?<rest>.*))?$' {
...
proxy_pass http://example/$rest;
...
}
Run Code Online (Sandbox Code Playgroud)
这样,rest
变量将在传递给proxy_pass directeve时被解码.这似乎是一种预期的行为.
问题是我的URI包含%20
从客户端传递的编码空间
http://example.com/lala%20lala
Run Code Online (Sandbox Code Playgroud)
nginx将URI解码为
http://example.com/lala lala
Run Code Online (Sandbox Code Playgroud)
我可以在我的error.log中看到它.
问题是 - 是否有可能rest
以某种方式使用编码变量,因为它是从客户端传递的?如果我做了一些完全错误的事情,请以正确的方式提出建议.
谢谢.
是的,虽然文档也说:
如果指定了proxy_pass而没有URI,则请求URI将以与处理原始请求时客户端发送的格式相同的形式传递给服务器,或者在处理更改的URI时传递完整的规范化请求URI:
location /some/path/ {
proxy_pass http://127.0.0.1;
}
Run Code Online (Sandbox Code Playgroud)
Nginx工程师说同样的话:https://serverfault.com/questions/459369/disabling-url-decoding-in-nginx-proxy
但是,如果您将$ request_uri附加到proxy_pass(并预先剥离区域设置,它可能会像Nginx工程师所说的那样工作):
set $modified_uri $request_uri;
if ($modified_uri ~ "^/([\w]{2})(/.*)") {
set $modified_uri $1;
}
proxy_pass http://example$modified_uri;
Run Code Online (Sandbox Code Playgroud)
小智 6
我在 nginx 后面的 Confluence 和其他 Atlassian 应用程序中使用以下内容取得了一些成功,其中 ( ) < > [ ] 等特殊字符导致了问题。
location /path {
# [... other proxy options ...]
# set proxy path with regex
if ($request_uri ~* "/path(/.*)") {
proxy_pass http://server:port/path$1;
break;
}
# fallback (probably not needed)
proxy_pass http://server:port/path;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13232 次 |
最近记录: |