我们正在尝试使用 NGINX 作为反向代理来过滤 URL 请求。基本上,如果您没有输入正确的 URL,您将无法访问。
这是我的服务器站点配置:
server {
listen 192.168.1.63:443;
ssl on;
ssl_certificate /etc/nginx/ssl/ssl.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
server_name domain.test.com;
set $upstream 192.168.1.10;
location ~* /(domain1|domain2|domain3|domain4|%7FVIC) {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://$upstream;
}
}
一切正常,除了%7FVIC
。我们试图保护的应用程序,客户端需要访问站点根目录下的变量/某些内容。因此 URL 为:https://domain.test.com/%7FVIC01663918
当我查看日志时,似乎 NGINX 正在拦截变量并重写它。以下是错误日志中的片段:
2018/06/18 14:57:30 [error] 11647#11647: *16 open() "/usr/share/nginx/htmlVIC01663918" failed (2: No such file or directory), client: xx.xx.xx.xx, server: test.domain.com, request: "POST /%7FVIC01663918 HTTP/1.1", host: "test.domain.com", referrer: "https://test/domain.com/domain1/"
看起来它正在%7FVIC
改变/htmlVIC01663918
那么我们如何让 NGINX 绕过这个变量或者忽略它并停止改变它呢?
答案1
这%7F
是 7Fh 字符代码的 URL 编码表示。nginx
将在处理请求之前对其进行解码。您可以在正则表达式location
语句中插入 7Fh 字符,但必须使用正则表达式语法而不是 URL 语法(例如\x7F
)。
例如:
location ~* /(domain1|domain2|domain3|domain4|\x7FVIC) { ... }