2013-10-21 5 views
12

Attualmente ogni pagina non valida è 500 (Errore interno del server) perché probabilmente ho incasinato la configurazione del mio blocco server.Come posso forzare il reindirizzamento di tutti gli 404 (o di ogni pagina, sia essa non valida o non valida) sulla home page?

Ho deciso di chiudere il mio sito Web qualche tempo fa e ho creato una semplice pagina di una pagina, grazie. Tuttavia i vecchi link e siti esterni stanno ancora tentando di accedere ad altre parti del sito, che non esiste più.

Come si fa a forzare il reindirizzamento di tutte le pagine non di homepage (eventuali URL non validi) nella home page?

ho provato con il seguente blocco, ma non ha funzionato:

location/{ 
    try_files $uri $uri/ $document_uri/index.html; 
} 

La mia configurazione corrente è (non so nemmeno servire PHP file in questo momento, vale a dire homepage è semplice html):

server { 
    server_name www.example.com example.com; 
    access_log /srv/www/example.com/logs/access.log; 
    error_log /srv/www/example.com/logs/error.log; 
    root /srv/www/example.com/public_html; 
    index index.php index.html; 

    location/{ 
     try_files $uri $uri/ $document_uri/index.html; 
    } 

    # Disable favicon.ico logging 
    location = /favicon.ico { 
     log_not_found off; 
     access_log off; 
    } 

    # Allow robots and disable logging 
    location = /robots.txt { 
     allow all; 
     log_not_found off; 
     access_log off; 
    } 

    # Enable permalink structures 
    if (!-e $request_filename) { 
     rewrite . /index.php last; 
    } 

    # Handle php requests 
    location ~ \.php$ { 
     try_files $uri = 404; 
     include /etc/nginx/fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_send_timeout 900; 
     fastcgi_read_timeout 900; 
     fastcgi_connect_timeout 900; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    } 

    # Disable static content logging and set cache time to max 
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { 
     access_log off; 
     log_not_found off; 
     expires max; 
    } 

    # Deny access to htaccess and htpasswd files 
    location ~ /\.ht { 
     deny all; 
    } 

    # Deny access to hidden files (beginning with a period) 
    location ~ /\. { 
     access_log off; log_not_found off; deny all; 
    } 
} 

risposta

25

Impostare la pagina di errore alla home page come questo

error_page 404 /index.html; 

ha un piccolo problema, il codice di stato della home page sarà "404 not found", se si vuole caricare la home page con un "200 OK" codice di stato si dovrebbe fare in questo modo

error_page 404 =200 /index.html; 

questo convertirà il "404 not found" il codice di errore a un codice "200 OK", e caricare la home page

il secondo metodo h @jvperrin menzionato è buona,

try_files $uri $uri/ /index.html; 

ma è necessario mantenere 1 cosa in mente, dal momento che è il location / qualsiasi attività che non corrisponde a un'altra posizione e non si ritrova anche caricare il index.html, per esempio immagini mancanti, css, file js, ma nel tuo caso posso vedere che hai già un'altra posizione che corrisponde alle estensioni delle risorse, quindi non dovresti affrontare questo problema.

+1

Non riesco a pensare a una situazione in cui è necessario "ignorare" il vero codice di stato http. Se una pagina non viene trovata, dovrebbe restituire un codice di stato 404. – ILikeTacos

+0

Ricordo che una volta dovevamo farlo al lavoro, ma non riesco a ricordare perché. –

+1

@AlanChavez Se gestisci un negozio, tutti i visitatori del tuo sito devono essere "convert-able". Se qualcuno riceve un URL vecchio o danneggiato e vede la pagina 404, vale $ 0. Se lo si reindirizza alla home page, c'è il potenziale che si guarderà intorno. L'invio di un codice di stato 200 per tutto il tempo garantisce inoltre che i sistemi di tracciabilità e analisi ottengano il maggior numero di dati possibile: molti sistemi visualizzeranno lo stato 404 e presumeranno che la pagina non porti da nessuna parte. – William

4

Provate ad aggiungere la seguente riga dopo il vostro index definizione:

error_page 404 /index.html; 

Se questo non funziona, provare a cambiare la vostra try_files chiamata al seguente invece:

try_files $uri $uri/ /index.html; 

Speriamo che una di quelle opere per voi, non ho ancora testato sia.

+1

Penso che funzionerebbe, tranne che ottengo 500 per ogni pagina non valida invece di 404. Riesci a vedere qualcos'altro che non va nella mia configurazione? – hobbes3

+0

C'è qualcosa nel tuo error.log sull'errore? – jvperrin

+0

Quando vado, ad esempio, 'www.esempio.com/asdasasd /' (che non esiste), ricevo un errore come 'riscrittura o ciclo di reindirizzamento interno mentre si reindirizza internamente a "404" '. – hobbes3

2

Per ottenere una vera reindirizzamento si potrebbe fare questo:

nel serverblock definire l'errore di pagine che si desidera reindirizzare in questo modo:

# define error page 
error_page 404 = @myownredirect; 
error_page 500 = @myownredirect; 

Poi si definisce quella posizione:

# error page location redirect 302 
location @myownredirect { 
    return 302 /; 
} 

In questo caso gli errori 404 e 500 generano HTTP 302 (reindirizzamento temporaneo) a/(potrebbero naturalmente essere tutti gli URL)

.210

Se si utilizza veloce-cgi per PHP o altro questi blocchi devono avere le seguenti aggiunte di inviare gli errori "upstrem" al server-block:

fastcgi_intercept_errors on; 
1

Deve usare

"fastcgi_intercept_errors on;" 

insieme al personalizzato reindirizzare posizione come error_page 404 =200 /index.html o

come sopra

location @myownredirect { 
    return 302 /; 
}