2012-07-04 16 views
22

Mam następujący fragment konfiguracji nginx:Nginx Usuń www i reagować zarówno

server { 
    listen 80; 

    server_name mydomain.io; 

    root /srv/www/domains/mydomain.io; 

    index index.html index.php; 

    access_log /var/log/nginx/domains/mydomain.io/access.log; 
    error_log /var/log/nginx/domains/mydomain.io/error.log; 

    location ~\.php { 
     try_files $uri =404; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_intercept_errors on; 
     fastcgi_pass 127.0.0.1:9000; 
     include /etc/nginx/fastcgi_params; 
    } 
} 

Po pierwsze, w jaki sposób mogę dokonać blokowy serwera reagować na bothhttp://www.mydomain.io a także http://mydomain.io. Po drugie, chcę wymusić, jeśli pochodzą z http://www.mydomain.io, aby przekierować do http://mydomain.io.

Dzięki.

Odpowiedz

-17

Na pierwsze pytanie - po prostu dodać obie domeny:

server_name mydomain.io www.mydomain.io; 

Dla sekundę, musisz to proste przekierowanie:

server { 
     listen 80; 

     server_name www.mydomain.io mydomain.io; 

     if ($host = 'www.mydomain.io') { 
     rewrite ^/(.*)$ http://mydomain.io/$1 permanent; 
     } 
+5

Korzystanie if w konfiguracjach nginx zdecydowanie nie zaleca się: http://wiki.nginx.org/IfIsEvil. Zamiast tego używaj dwóch bloków serwerów zgodnie z sugestią @Gerry – Jrgns

+3

@Jrgns: Również "przepisywanie" jest wymienione jako jeden z dwóch "100% bezpiecznych rzeczy, które mogą być wykonane wewnątrz, jeśli w kontekście lokalizacji" w wiki nginx ... – Tisho

+2

Jeśli to dostaje wystarczającą liczbę głosów w dół, że jej wartość jest ujemna, czy system nadal zachowuje ją jako wybraną odpowiedź? – Bryson

13

wierzę, że lepiej, aby dodać dwa oddzielne bloki serwera aby uniknąć niepotrzebnego sprawdzania przez blok if. Używam również zmiennej $ scheme, aby żądania HTTPS nie były przekierowywane do ich niezabezpieczonych odpowiedników.

server { 
    listen 80; 

    server_name www.mydomain.io; 

    rewrite^$scheme://mydomain.io$uri permanent; 
} 

server { 
    listen 80; 

    server_name mydomain.io; 

    # your normal server block definitions here 
} 
+3

Wpisałem to na głos przez pomyłkę, ale jest to również niepoprawna odpowiedź. Użycie 'rewrite' w ten sposób jest wysoce odradzane przez samą dokumentację NGINX. Zobacz odpowiedź Ryana na temat właściwego użycia 'return 301 $ scheme: //domain.com$request_uri;' – Bryson

137

Według https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if, należy użyć:

server { 
    server_name www.example.com; 
    return 301 $scheme://example.com$request_uri; 
} 
server { 
    server_name example.com; 
    # [...] 
} 
+20

Proszę, uproście to, ludzie. Z przykrością muszę przyznać, że najmniej odpowiednia odpowiedź została zaakceptowana, druga najlepsza z większością głosów ... tymczasem właściwa odpowiedź traci na znaczeniu. Odpowiedź Gerry'ego jest lepsza niż Tisho, jednak odpowiedź Ryana jest zalecana. Pomyśl o tym. Czy chcesz, aby serwer odpowiadał na dwa żądania dla każdego żądania, które otrzyma na www? Nie, nie, nie. – Charlesism

+2

Całkowicie się zgadzam !! – Bazinga777

+0

Używam bardziej ogólny blok, który obsługuje mój serwer lokalny (localhost). niestety oznacza to, że w produkcji "www." nie upada.jak mogę poprawić ten blok? (przepraszam za złe formatowanie) serwer { słuchaj 80; nazwa_serwera ~^(www | app) \. (. *) $; return 301 $ scheme: // $ 1 $ request_uri; } – robinnnnn

2

Innym sposobem na to kod:

if ($http_host ~* "^www\.(.+)$"){ 
    rewrite ^(.*)$ http://%1$request_uri redirect; 
} 

Działa nawet z wielu nazw domen na tym samym kodzie.

-1
server { 
    listen 80; 
    server_name www.mydomain.io; 
    return 301 https://$host$request_uri; 
} 

server { 
    listen 80; 
    server_name mydomain.io; 
    ... 
} 
+0

Zmienna $ host w pierwszym bloku serwera ma wartość "www.mydomain.io". Przekierowujesz więc żądanie z http: // www.mydomain.io na https: // www.mydomain.io, ale nie na mydomain.io –

Powiązane problemy