Nginx使用DirectorySlash指令向Apache反向代理

时间:2019-01-24 18:48:14

标签: apache nginx

我需要反向代理到在本地主机上运行的Apache服务器。问题在于,作为其DirectoryRewrite指令的一部分,Apache将请求重定向到不带斜杠的目录,而将请求重定向到带斜杠的目录。转到https://myhost/sw/myapp/时,下面的nginx设置可以正常工作,但是如果忘记了尾随的前斜杠,最终将被重定向到http://myhost:8080/sw/myapp。缺少禁用Apache DirectoryRewrite指令的方法,如何确保始终将/添加到任何请求的末尾,以使Apache不会重定向?

server {
    client_max_body_size 10240M;
    listen      443 ssl;
    server_name  "";

    ssl_certificate      ../ssl/server.crt;
    ssl_certificate_key  ../ssl/server.key;

    ssl_session_timeout  5m;

    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    location /sw {
        proxy_pass  http://127.0.0.1:8080/sw;
        proxy_redirect ~^http://127.0.0.1:8080/sw/([^.]*[^/])$ https://$host/sw/$1/;
        proxy_redirect http://127.0.0.1:8080/ https://$host/;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_buffering off;
        proxy_set_header        HOST            $host;
        proxy_set_header        Referer         $http_referer;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        error_page 301 302 303 = @handle_redirect;
    }

1 个答案:

答案 0 :(得分:1)

如果上游服务器重定向到http://example.com:8080/(而不是http://127.0.0.1:8080/),则需要更改或添加另一个proxy_redirect语句。有关详细信息,请参见this document

例如:

proxy_redirect http://example.com:8080/ https://example.com/;

或者如您在评论中所述:

proxy_redirect http://$host:8080/ https://$host/;

proxy_redirect值必须与3xx响应中Location:头的开头完全匹配。您可以使用curl -I来标识该响应标头的确切内容。