2015-07-17 32 views
24

Mój plik konfiguracyjny ma blok kierowniczą server zaczynający się od ...

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

... w celu umożliwienia dostępu do strony z różnymi nazwami domen.

Jednak PHP $_SERVER['SERVER_NAME'] zawsze zwraca pierwszy wjazd server_name, w tym przypadku http://www.example1.com

więc nie mam z kodu PHP wiedzieć, jakie domeny użytkownik używany do uzyskania dostępu do witryny.

Czy jest jakiś sposób, aby powiedzieć nginx/fastcgi, aby przekazać prawdziwą nazwę domeny używanej do uzyskania dostępu do witryny?


Jedynym rozwiązaniem znalazłem tak daleko jest, aby powtórzyć całą server blok dla każdej domeny z wyraźną server_name wpisu ale oczywiście szukam lepszego.

+1

może używać Host w kodzie zamiast-http: //wiki.nginx.org/HttpCoreModule#.24host – edmondscommerce

+0

Dlaczego nie tworząc 3 pliki konfiguracyjne strona w nginx pod \ etc \ nginx \ strony są dostępne dla każdej witryny wskazującej tę samą lokalizację? –

+0

@maytham oczywiście mogę to zrobić, ale dokładnie to, czego staram się uniknąć (replikacja identycznych plików konfiguracyjnych) – Paolo

Odpowiedz

7

Jest to przeznaczone i właściwym rozwiązaniem jest użycie w swoim kodzie kodu $_SERVER['HTTP_HOST'].

należy interpretować SERVER_NAME jako zweryfikowane serwera, nazwę i HTTP_HOST jako wejście użytkownika, które mogą być łatwo modyfikowane, a zatem nie należy ufać.

+0

dziękuję. To jest najprostsze rozwiązanie i prawdopodobnie z nim pójdę. Jednak wolałbym znaleźć sposób na użycie "SERVER_NAME", ponieważ jest to nazwa hosta wirtualnego, ponieważ jest on zdefiniowany jako ** nginx ** dla żądania stosującego dyrektywy konfiguracyjne. ''HTTP_HOST'' pochodzi bezpośrednio z nagłówka żądania (jeśli klient go wysłał). Oczywiście poprawnie skonfigurowany ** nginx ** odrzuciłby żądania ze zepsutymi nagłówkami hostów http czyniąc ''HTTP_HOST'' niezawodnym ... – Paolo

+0

Rozumiem, że próbujesz jakiejś częściowej walidacji w twojej konfiguracji nginx; ale jak już wspomniałeś, poprawnie skonfigurowany nginx zezwoli tylko na * prawidłowe * wpisy HTTP_HOST. Traktowanie HTTP_ * jako niezaufanego jak inne dane wprowadzane przez użytkownika nadal jest dobrym pomysłem. Rozróżnienie między "SERVER_NAME" i "HTTP_HOST" jest całkiem użyteczne, jeśli rozumiesz różnicę. – Sjon