nginx „server“-Direktive mit mehreren „server_name“-Einträgen: Immer zuerst wird einer an $_SERVER von PHP übergeben[‘SERVER_NAME’]

Lesezeit: 2 Minuten

Benutzer-Avatar
Paolo

Meine Konfigurationsdatei hat eine server Direktivenblock, der mit beginnt …

server {
    server_name www.example1.com www.example2.com www.example3.com;

…um den Zugriff auf die Seite mit unterschiedlichen Domainnamen zu ermöglichen.

Allerdings PHP $_SERVER['SERVER_NAME'] gibt immer den ersten Eintrag von zurück server_namein diesem Fall http://www.example1.com

Ich habe also keine Möglichkeit aus dem PHP-Code zu erfahren, welche Domain der Benutzer verwendet hat, um auf die Site zuzugreifen.

Gibt es eine Möglichkeit, nginx/fastcgi anzuweisen, den tatsächlichen Domänennamen zu übergeben, der für den Zugriff auf die Website verwendet wird?


Die einzige Lösung, die ich bisher gefunden habe, ist, das Ganze zu wiederholen server Block für jede Domäne mit einem eindeutigen server_name Eintrag, aber offensichtlich suche ich nach einem besseren.

  • Verwenden Sie stattdessen möglicherweise Host in Ihrem Code –wiki.nginx.org/HttpCoreModule#.24host

    – edmondscommerce

    17. Juli 2015 um 16:00 Uhr

  • Warum nicht 3 Site-Konfigurationsdateien in nginx unter \etc\nginx\sites-verfügbar für jede Site erstellen, die auf denselben Speicherort verweist?

    – Maytham Fahmi

    26. Juli 2015 um 7:34 Uhr

  • @maytham natürlich kann ich das tun, aber genau das versuche ich zu vermeiden (replizieren identischer Konfigurationsdateien)

    – Paulo

    27. Juli 2015 um 15:20 Uhr

Satz SERVER_NAME benutzen $host in deiner fastcgi_params Aufbau.

fastcgi_param   SERVER_NAME         $host;

Quelle: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param

  • Sie haben nach oben gestimmt, aber warum ist dieses Standardverhalten nicht so, erscheint mir logisch. Warum wird stattdessen das erste Element im server_name-Block verwendet?

    – David

    7. Februar 2016 um 23:17 Uhr


  • Immer deklarieren fastcgi_param Aussagen nach dem include fastcgi_params; -Anweisung, um Mehrdeutigkeiten in Ihren Konfigurationsdateien zu vermeiden.

    – KM

    7. August 2020 um 4:14 Uhr

Benutzer-Avatar
Sjon

Dies ist beabsichtigt und die richtige Lösung ist zu verwenden $_SERVER['HTTP_HOST'] stattdessen in Ihrem Code.

Sie sollten interpretieren SERVER_NAME Als ein verifiziert Servername und HTTP_HOST als Benutzereingabe, die recht einfach geändert werden kann und daher nicht vertrauenswürdig ist.

  • Danke. Dies ist die einfachste Lösung und ich werde wahrscheinlich damit gehen. Allerdings hätte ich es vorgezogen, einen Weg zu finden, es zu verwenden 'SERVER_NAME' da es der Name des virtuellen Hosts ist, wie er definiert wird nginx Behandeln Sie die Anforderung unter Anwendung der Konfigurationsanweisungen. 'HTTP_HOST' kommt direkt aus dem Request-Header (sofern der Client ihn gesendet hat). Natürlich eine richtig konfigurierte nginx würde Anfragen mit schlechten HTTP-Host-Headern ablehnen 'HTTP_HOST' zuverlässig…

    – Paulo

    22. Juli 2015 um 8:18 Uhr


  • Soweit ich weiß, versuchen Sie eine Art Teilvalidierung in Ihrer Nginx-Konfiguration. Aber wie Sie bereits erwähnt haben, lässt ein richtig konfiguriertes Nginx nur zu gültig HTTP_HOST-Einträge. Es ist immer noch eine gute Idee, HTTP_* wie andere Benutzereingaben als nicht vertrauenswürdig zu behandeln. Die Unterscheidung zwischen SERVER_NAME und HTTP_HOST ist ziemlich nützlich, wenn Sie den Unterschied verstehen

    – Sjon

    22. Juli 2015 um 8:27 Uhr


1146160cookie-checknginx „server“-Direktive mit mehreren „server_name“-Einträgen: Immer zuerst wird einer an $_SERVER von PHP übergeben[‘SERVER_NAME’]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy