与乘客合作时保留双斜线

与乘客合作时保留双斜线

我的网站上有一些由 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

相关内容