nginx 프록시를 Apache에 사용할 때 여러 개의 슬래시와 모든 트롤링 슬래시를 유지하십시오.

nginx 프록시를 Apache에 사용할 때 여러 개의 슬래시와 모든 트롤링 슬래시를 유지하십시오.

약간의 배경 지식이 있습니다. Apache가 있는 이전 서버에서 Apache에 대한 NGINX 프록시가 있는 새로운 Ubuntu 서버로 웹 사이트를 이동하는 중입니다. 웹사이트 코드베이스가 이전 서버와 새 서버 모두에서 실행되는 전환 기간이 있을 것입니다.

웹사이트에는 슬래시로 구분되고 종종 선택 사항인 필터가 포함된 검색 URL이 있습니다.

www.example.com/search/deals/q1/q2/q3/q4/q5/q6/

이는 다음 apache.conf 재작성 규칙에 매핑됩니다.

RewriteRule ^/search/deals/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/  /results.php?q1=$1&q2=$2&q3=$3&q4=$4&q5=$5&q6=$6 [L,QSA]

아래와 같은 URL을 갖는 것은 드문 일이 아닙니다.

www.example.com/search/deals/q1////q5/q6/

www.example.com/search/deals/q1/q2/q3///q6/

www.example.com/search/deals/q1/q2/q3/q4///

새 서버에서 다음과 같이 NGINX를 구성했습니다. 두 사이트에서 기본 서버 아파치 파일과 example.com 파일을 활성화했습니다.

/etc/nginx/sites-enabled/apache -> ../sites-available/apache
/etc/nginx/sites-enabled/example.com -> ../sites-available/example.com

아파치는 다음과 같습니다(실제 IP는 10.10.10.10으로 대체됨).

server {
    listen 10.10.10.10:80 default_server;
    merge_slashes off; #have tried with/without

    location / {
        proxy_redirect off; #have tried with/without
        port_in_redirect off; #have tried with/without
        proxy_pass http://10.10.10.10:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

example.com은 그런 것 같아요

server {
        listen 10.10.10.10:80 ;
        server_name example.com www.example.com;
        root /var/www/live/example.com/frontend/htdocs;
        merge_slashes off;

    location / {
        fastcgi_pass unix:/var/run/php5-fpm.sock; #have tried with/without
        include fastcgi_params; #have tried with/without


        proxy_redirect off; #have tried with/without
        port_in_redirect off; #have tried with/without
        proxy_pass http://10.10.10.10:8080 ;
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;#have tried with/without
        proxy_set_header X-Accel-Internal /internal-nginx-static-location; #have tried with/without
        access_log off;
    }

}

변경한 후 다음을 통해 NGINX를 다시 시작했습니다.

service nginx restart

예를 들어 www.example.com/search/deals/q1/q2////q6/ 페이지를 로드하면 '파일을 찾을 수 없습니다'라는 메시지가 표시되고 로그 수준이 3으로 설정된 Apache 로그를 보면 아래와 같은 결과가 나타납니다.

[Wed Oct 07 22:52:10.178436 2015] [rewrite:trace1] [pid 4186:tid 123456789] mod_rewrite.c(468): [client 10.10.10.10:33468] 10.10.10.10 - - [www.example.com/sid#sddsaddsa][rid#sddsaddsa/subreq] pass through /search/deals/q1/q2/q5/

이는 어느 시점에서 프록시를 통해 여러 개의 슬래시가 모두 제거되었음을 나타냅니다. 하지만 Apache 규칙이 매개변수를 올바르게 라우팅할 수 있도록 URL을 그대로 유지해야 합니다.

비슷한 제목의 다른 답변을 보았지만 그 중 어느 것도 내 문제를 해결하지 못했습니다. 승객과 작업할 때 이중 슬래시를 유지하세요

https://stackoverflow.com/questions/4320774/nginx-how-to-keep-double-slashes-in-urls

https://stackoverflow.com/questions/14832780/nginx-merge-slashes-redirect

https://stackoverflow.com/questions/22759345/nginx-trailing-slash-in-proxy-pass-url

https://stackoverflow.com/questions/5834025/how-to-preserve-request-url-with-nginx-proxy-pass

...

누구든지 어떤 제안이 있거나 나에게 올바른 방향을 알려줄 수 있다면 좋을 것입니다.

미리 감사드립니다

관련 정보