我的网站上有一些由 encodeURI 函数编码的嵌套 URL。
www.site.com/http%3A%2F%2Fwww.site.com%2F
我的网站使用 nginx 0.8.53 运行,问题是当 nginx 获得这样的 URL 时,它会解码整个 URL 并删除双斜杠,将错误的 URL 传递给乘客,然后传递给我的 ruby 代码。这是我的常规 nginx 配置:
daemon off;
user www-data;
pid /var/run/nginx.pid;
worker_processes 1;
events {
worker_connections 1024;
}
http {
passenger_root /usr/local/rvm/gems/ruby-1.9.2-p136@global/gems/passenger-3.0.2;
passenger_ruby /usr/local/rvm/wrappers/[email protected]/ruby;
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nodelay on;
gzip on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
log_format combined-realip '$remote_addr ($http_x_real_ip) - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /opt/nginx/logs/access.log combined-realip;
if (-f /home/site.com/current/maintenance) {
return 503;
}
root /home/site.com/current/public;
passenger_enabled on;
rack_env production;
passenger_set_cgi_param SERVER_NAME $http_host;
error_page 503 /503.html;
location = /503.html {
root html;
}
include /home/site.com/current/*nginx.conf;
}
}
我尝试在 /home/site.com/current/nginx.conf 中将 merge_slashes 设置为 off
merge_slashes off;
但它不起作用。除了以独立方式启动 Passenger 并使用 proxy_pass 之外,我没有其他想法,但另一个问题是我正在使用提供 nginx 和 Passenger 的云服务,我只能编辑 /home/site.com/current/nginx.conf,而不能进行其他操作。
请帮我。
答案1
合并斜杠仅作为指令在服务器块中,当该服务器是默认服务器。请在您的 http 块中指定它。
但请注意,即使关闭了merge_slashes,nginx 仍然会解码斜杠,并且乘客仍会合并它们。我在我的网站上解决了这个问题,方法是在我的操作中查找“http:/”之类的内容并进行适当的修改:
missing_double_slash_match = /\A([a-z]+)\:\/([^\/])/.match(term)
if !missing_double_slash_match.nil?
term = term.sub(missing_double_slash_match[0], "#{missing_double_slash_match[1]}://#{missing_double_slash_match[2]}")
end