2013-05-14 11 views
5

Sto cercando di riscrivere /index.html a/per scopi SEO (stupidi motori di ricerca che confondono index.html con/e penalizza per contenuti duplicati) - anche per riconciliare i dati di analisi web .nginx /index.html to/rewrite

Ho provato ogni soluzione che ho trovato su stackoverflow, la documentazione di nginx, ecc. E non ho avuto successo. Sto pensando che devo avere qualche altro problema di configurazione o qualcos'altro che sia doloroso. Questa è la mia prima installazione di nginx, usata per Apache e IIS !!

Ecco il mio 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; 
    #} 

Ecco il mio virtual.conf (commentata sezione era il mio tentativo più recente - quando non è commentato dà un 301 Moved Permanently di errore quando si tenta di accedere a www .dominio.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; 
    } 

HTTP di risposta intestazioni per soluzione di cobaco:

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/ 

Ho pensato che questa linea potrebbe causare problemi: "location = /index.html {return 301 $ scheme: //domain.com/;}" così ho aggiunto www. dopo "schema: //" - fammi sapere se questa è una brutta cosa da fare! Ciò ha provocato le seguenti intestazioni di risposta HTTP:

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/ 

Dopo un po 'di più ritocchi, la seguente configurazione fa quello che voglio fare, ma non è l'ideale a causa del if. Eventuali suggerimenti?

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

risposta

4

La soluzione finale è assolutamente soddisfacente.

if direttiva è male SOLO SE si trova all'interno di un blocco location. Inoltre, hai solo una direttiva return all'interno del blocco if. Non vedo niente di sbagliato in questo. di riferimento: http://wiki.nginx.org/IfIsEvil

Il loop di reindirizzamento infinito in soluzione di cobaco è perché

index index.html; 

innesca un altro giro di partita posizione. Quindi nginx sarà nuovamente intrappolato nello location = /index.html dopo essere stato reindirizzato su http://www.domain.com/.

+0

grazie, felice che funzioni bene! :) – auralsun

0

301 non è davvero un errore, è solo un colpo di testa dicendo al browser che ha bisogno di reindirizzare verso la nuova destinazione, i browser web gestiscono queste intestazioni automaticamente e silenziosamente, ma se si sta scrivendo qualche ricciolo app allora dovresti istruirlo a rispettare e gestire quelle intestazioni. Ed è 301 perché si scrive permanent nella configurazione, 302 è temporary

quando ho provato la tua riscrittura ha funzionato con me, ma ho usato il ritorno al posto di riscrittura del server non reindirizzamento

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

anche sarebbe meglio se si cambia il server reindirizzamento da usare di ritorno, anche

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

EDIT: cambiato il blocco if al blocco posizione come @cobaco suggerito, non so il motivo per cui ho perso s UCH uno stupido errore

2

Di seguito vi fare quello che vuoi:

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

notare:

  • utilizzare un blocco location invece di if quando possibile (perché if all'interno di un location è noto per causa problemi vedere per i dettagli)
  • utilizzare return non rewrite per 301 s (Come è più efficiente)
  • utilizzare le variabili predefinite invece di corrispondenza regex (come è più efficiente, vedere http://wiki.nginx.org/HttpCoreModule#Variables per un elenco di variabili built-in)
  • root e index direttive dovrebbe normalmente essere sempre al livello principale del server -blocco (altrimenti è necessario ripeterli per ogni sottoblocco)
+1

Grazie! Ho implementato la tua soluzione e penso di seguire la logica, ma per qualche motivo sto ricevendo un reindirizzamento infinito usando questo e praticamente ogni altro (legittimo ma probabilmente meno efficiente) metodo di reindirizzamento che ho provato. Ho postato le risposte HTTP risultanti dal tuo suggerimento nel mio OP in quanto la formattazione sembra impossibile nei commenti. – auralsun