假设我想要在URL中对文章标题进行编码,该URL包含一个斜杠。如果我对得到的文章标题进行URL编码:
http://example.com/articles/foo%2fbar/view/
NGINX将其传递给我的FastCGI应用程序:
http://example.com/articles/foo/bar/view/
这相当于毁了这个想法。
我注意到,如果NGINX正在提供一个文件,比如/path/to/page.html,那么可以通过以下两个URL之一到达:
http://example.com/path/to/page.html
http://example.com/path/to%2fpage.html
然而,(例如) Apache并非如此。
有什么方法可以解决这个问题吗?
我试过docs和Google,但都没有成功。
谢谢。
更新
nginx配置:
worker_processes 1;
pid ./nginx.pid;
events {
worker_connections 1024;
}
http {
server_tokens off;
server {
listen 80;
server_name localhost;
location /mysite/{
fastcgi_pass unix: ./mysite.fcgi.socket;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SCRIPT_NAME "/mysite/";
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
}
}
发布于 2011-11-28 01:44:31
尝试将"%“转义为"%25”
http://example.com/articles/foo%252fbar/view/
发布于 2018-12-18 05:33:50
如果你是proxy_pass
用户,Nginx pass_proxy subdirectory without url decoding上提供了关于这个问题的更多细节,它有一个完整的解决方案。
对于fastcgi_pass
,,这可能是由于nginx中的默认conf/fastcgi.conf
造成的,其中DOCUMENT_URI
变量被设置为http://nginx.org/r/$document_uri,这等同于http://nginx.org/r/$uri,反过来,它是http://nginx.org/r/$request_uri的规范化(解码和未转义)、无查询和可能重写的版本(反过来,可以通过REQUEST_URI
访问):
fastcgi_param REQUEST_URI $request_uri;fastcgi_param DOCUMENT_URI $document_uri;
然而,在您的示例中,您似乎根本没有指定DOCUMENT_URI
,因为如果在当前级别使用http://nginx.org/r/fastcgi_param,则不会从上一级别继承,因此,解码后的路径可能来自您的http://nginx.org/r/$fastcgi_path_info,而您在提供的配置中省略了http://nginx.org/r/fastcgi_split_path_info,因此,原始问题可能看起来不一致,因为所提供的请求和示例配置之间的确切路径也不匹配。
无论如何,fastcgi
的最佳修复将取决于应用程序,并且可能是以下之一:
/../
这样的东西(包括所有转义的变体),这当然是为了保护你免受backend.QUERY_STRING
中的查询参数来确保路径不会混淆或解码prematurely.REQUEST_URI
以在没有任何规范化或解码的情况下获得原始请求URI。$uri
或$document_uri
的所有实例,可能还有$fastcgi_path_info
。$request_uri
放回$uri
中。请注意,如果走此路线,您可能还必须手动剥离查询字符串。顺便说一句,你首先要做的就是玩火,因为如果你没有完全理解你在做什么,如果有一天有人决定利用你依赖于这些编码路径绕过对nginx的正确处理和审查,那么很容易引入安全漏洞。
事实是,你想要做的事情在Apache中按原样工作更多的是一个bug,而不是一个功能-这在nginx中的工作方式是不同的,因为它的设计和为了防止整个类别的安全漏洞。
发布于 2015-10-20 21:06:49
如果您使用URL查询参数,则不会有任何问题。当您可以控制您的服务器路由时,您可以执行以下操作:
http://example.com/articles/view/?path=foo%2fbar
并且nginx不会接触%2f
https://stackoverflow.com/questions/8264239
复制相似问题