Behalten Sie mehrere Schrägstriche und alle abschließenden Schrägstriche bei, wenn Sie Nginx als Proxy für Apache verwenden.

Behalten Sie mehrere Schrägstriche und alle abschließenden Schrägstriche bei, wenn Sie Nginx als Proxy für Apache verwenden.

Also ein wenig Hintergrund. Ich bin gerade dabei, die Website von alten Servern mit Apache auf neue Ubuntu-Server mit NGINX-Proxy zu Apache zu verschieben. Es wird eine Übergangsphase geben, in der die Codebasis der Website sowohl auf alten als auch auf neuen Servern ausgeführt wird.

Die Website verfügt über Such-URLs mit Filtern, die durch Schrägstriche getrennt sind und oft optional sind, z. B.

www.example.com/suche/angebote/q1/q2/q3/q4/q5/q6/

die der folgenden Umschreiberegel für apache.conf entspricht:

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

Es ist nicht ungewöhnlich, URLs wie die folgenden zu haben

www.example.com/suche/angebote/q1////q5/q6/

www.example.com/suche/angebote/q1/q2/q3///q6/

www.example.com/suche/angebote/q1/q2/q3/q4///

Auf dem neuen Server habe ich NGINX wie folgt konfiguriert: zwei Sites aktiviert eine Standardserver-Apache-Datei und eine example.com-Datei

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

Apache sieht folgendermaßen aus (echte IP durch 10.10.10.10 ersetzt):

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 sieht so aus

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;
    }

}

Nach jeder Änderung habe ich NGINX neu gestartet über

service nginx restart

Wenn ich z. B. die Seite www.example.com/search/deals/q1/q2////q6/ lade, erhalte ich die Meldung „Datei nicht gefunden“. Wenn ich mir dann das Apache-Protokoll mit der Protokollebene 3 ansehe, erhalte ich Folgendes:

[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/

Das bedeutet, dass alle mehrfachen Schrägstriche irgendwann über den Proxy entfernt wurden. Aber ich brauche die URL, damit sie intakt bleibt, damit die Apache-Regel die Parameter richtig weiterleiten kann.

Ich habe mir andere Antworten mit ähnlichen Titeln angesehen und keine davon löst mein Problem, z. B.: behalten Sie doppelte Schrägstriche bei der Arbeit mit Passagieren

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/wie-man-die-Request-URL-mit-nginx-proxy-pass-aufbewahren-kann

...

Es wäre großartig, wenn jemand Vorschläge hätte oder mir den richtigen Weg weisen könnte.

Dank im Voraus

verwandte Informationen