2013-05-14 22 views
5

Próbuję przepisać /index.html na/dla celów SEO (głupie wyszukiwarki, które mylą index.html z/i penalize dla duplikatów treści) - również pogodzić dane analityki internetowej .nginx/index.html do/przeprogramować

Próbowałem każdego rozwiązania, które znalazłem na stackoverflow, dokumentacji nginx itp. I nie odniosłem sukcesu. Myślę, że muszę mieć inny problem z konfiguracją lub coś bardzo bolesnego oczywistego. To jest moja pierwsza instalacja nginx - używana do Apache i IIS !!

Oto moja default.conf:

server { 
    listen  80; 
    server_name web.local; 
    #charset koi8-r; 
    #access_log /var/log/nginx/log/host.access.log main; 

    #error_page 404    /404.html; 

    # redirect server error pages to the static page /50x.html 
    # 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /var/www/html; 
    } 

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80 
    # 
    #location ~ \.php$ { 
    # proxy_pass http://127.0.0.1; 
    #} 

Oto moja virtual.conf (wykomentowane sekcja była moja najnowsza próba - kiedy Odkomentowano daje 301 Przeniesiono na stałe błędzie podczas próby dostępu do internetu .domena.com/index.html):

server { 
    listen  80; 
    server_name www.domain.com; 

    location/{ 
     root /var/www/html/domain.com; 
     index index.html; 
     #if ($request_uri = /index.html) { 
     # rewrite^http://www.domain.com permanent; 
     #} 
    } 
} 

server { 
    listen 80; 
    server_name domain.com; 
    rewrite ^/(.*) http://www.domain.com/$1 permanent; 
    } 

nagłówki HTTP Response do sporządzania roztworu cobaco za:

URL: 
http://www.domain.com 
http/1.1 301 moved permanently 
server: nginx/1.2.8 
date: Thu, 16 May 2013 01:42:58 GMT 
content-type: text/html 
content-length: 184 
connection: keep-alive 
location: http://domain.com/ 

Redirecting URL: 
http://domain.com/ 
http/1.1 301 moved permanently 
server: nginx/1.2.8 
date: Thu, 16 May 2013 01:42:58 GMT 
content-type: text/html 
content-length: 184 
connection: keep-alive 
location: http://www.domain.com/ 

Uznałem, że ta linia może powodować problemy: "location = /index.html {return 301 $ scheme: //domain.com/;}", więc dodałem www. po "scheme: //" - daj mi znać, jeśli jest to złe! Spowodowało to kolejne nagłówki HTTP Response:

URL: 
http://www.domain.com 
http/1.1 301 moved permanently 
server: nginx/1.2.8 
date: Thu, 16 May 2013 01:42:58 GMT 
content-type: text/html 
content-length: 184 
connection: keep-alive 
location: http://www.domain.com/ 

Redirecting URL: 
http://www.domain.com/ 
http/1.1 301 moved permanently 
server: nginx/1.2.8 
date: Thu, 16 May 2013 01:42:58 GMT 
content-type: text/html 
content-length: 184 
connection: keep-alive 
location: http://www.domain.com/ 

po pewnym więcej majsterkowania, następująca konfiguracja robi to, co chcę zrobić, ale nie jest idealne ze względu na if. Jakieś sugestie?

server { 
    server_name www.domain.com; 
    root /var/www/html/domain.com; 
    index index.html; 
    if ($request_uri = /index.html) { 
     return 301 http://www.domain.com/; 
    } 
    #location = /index.html { 
    # return 301 $scheme://www.domain.com/; 
    #} 
} 

server { 
    listen 80; 
    server_name domain.com; 
    return 301 $scheme://www.domain.com$request_uri; 
} 

Odpowiedz

4

Twoje ostateczne rozwiązanie jest całkowicie w porządku.

Dyrektywa jest zła TYLKO jeżeli znajduje się wewnątrz bloku location. Ponadto masz tylko dyrektywę return wewnątrz bloku if. Nie widzę w tym nic złego. odniesienia: http://wiki.nginx.org/IfIsEvil

nieskończony pętli przekierowanie w roztworze cobaco jest dlatego

index index.html; 

uruchamiają kolejną rundę lokalizacji meczu. Tak więc nginx zostanie ponownie uwięziony w location = /index.html po przekierowaniu do http://www.domain.com/.

+0

dziękuję, cieszę się, że działa dobrze! :) – auralsun

0

301 nie jest to błąd, to tylko nagłówek mówi przeglądarce, że musi przekierowywać do nowego miejsca przeznaczenia, przeglądarek internetowych obsługiwać te nagłówki automatycznie i cicho, ale jeśli piszesz jakiś curl aplikację następnie powinieneś poinstruować go, aby szanował i obsługiwał te nagłówki. I to 301 bo piszesz permanent w konfiguracji, 302 jest temporary

gdy próbowałem swoją przepisać pracował ze mną, ale użyłem zwrotu zamiast przepisać w braku serwera przekierowującego

location = /index.html { 
    return 301 $scheme://$host; 
} 

też go byłoby lepiej, jeśli zmieni swój serwer przekierowujący do korzystania powrotu oraz

server { 
    server_name domain.com; 
    return 301 $scheme://www.domain.com$request_uri; 
} 

EDIT: zmienił jeśli bloku do bloku lokalizacji jak @cobaco zasugerował, nie wiem dlaczego brakowało mi s Uch głupi błąd

2

Poniższa będą robić to, co chcesz:

server { 
    server_name www.domain.com; 
    root /var/www/html/domain.com; 
    index index.html; 
    location = /index.html {return 301 $scheme://www.domain.com/;} 
} 

server { 
    listen 80; 
    server_name domain.com; 
    return 301 $scheme://www.domain.com$request_uri; 
} 

do uwaga:

  • użyć location bloku zamiast if jeśli to możliwe (bo if wewnątrz location jest znany powodować problemy zobacz szczegóły pod http://wiki.nginx.org/IfIsEvil)
  • użyć return nie rewrite dla 301-tych (Jak to jest bardziej wydajne)
  • używać wbudowanych zmiennych zamiast dopasowywania regex (jak to jest bardziej wydajny, zobacz http://wiki.nginx.org/HttpCoreModule#Variables na liście zmiennych wbudowanych)
  • root i index dyrektywy powinny normalnie być zawsze na głównym poziomie server -block (w przeciwnym razie musisz je powtórzyć dla każdego podbloku)
+1

Dzięki! Zaimplementowałem twoje rozwiązanie i myślę, że podążam za logiką, ale z jakiegoś powodu otrzymuję nieskończone przekierowanie z użyciem tej i zasadniczo każdej innej (legalnej, ale prawdopodobnie mniej wydajnej) metody przekierowania, którą próbowałem. Napisałem wynikowe odpowiedzi HTTP Twojej sugestii w moim OP, ponieważ formatowanie wydaje się niemożliwe w komentarzach. – auralsun