2012-11-29 12 views
23

Avere il seguente nginx vhost config:Pagine di errore Nginx - Una regola di posizione per adattarle a tutte?

server { 
    listen 80; 
    listen 443 ssl; 
    server_name default; 
    root /var/www/default/html; 
    error_log /var/www/default/log/error.log; 
    access_log /var/www/default/log/access.log; 
    ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; 
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; 

    autoindex on; 
    index index.html index.php; 

    location/{ 
     try_files $uri $uri/ @php; 
    } 

    location @php { 
     rewrite ^/(.*)/?$ /index.php/$1 last; 
    } 

    location ~* /(?:[.]|.*[.](?:bak|fla|inc|ini|log|psd|sh|sql|swp)|(?:file|upload)s?/.*[.](?:php)) { 
     deny all; 
    } 

    location ~* [.](?:php) { 
     fastcgi_buffer_size    128k; 
     fastcgi_buffers     4 256k; 
     fastcgi_busy_buffers_size  256k; 
     fastcgi_connect_timeout   30; 
     fastcgi_ignore_client_abort  off; 
     fastcgi_index     index.php; 
     fastcgi_intercept_errors  on; 
     fastcgi_pass     unix:/var/run/php5-fpm.sock; 
     fastcgi_read_timeout   60; 
     fastcgi_send_timeout   60; 
     fastcgi_split_path_info   ^(.+[.]php)(/.*)$; 
     fastcgi_temp_file_write_size 256k; 

     include /etc/nginx/fastcgi_params; 
    } 

    error_page 403 /403.html; location = /403.html { 
     root /var/www/default/error; 
    } 

    error_page 404 /404.html; location = /404.html { 
     root /var/www/default/error; 
    } 

    error_page 405 /405.html; location = /405.html { 
     root /var/www/default/error; 
    } 

    error_page 500 501 502 503 504 /5xx.html; location = /5xx.html { 
     root /var/www/default/error; 
    } 
} 

E 'possibile avere le 40x e 50x errori serviti da una singola regola posizione? Qualcosa di simile:

error_page 403 /403.html; 
error_page 404 /404.html; 
error_page 405 /405.html; 
error_page 500 501 502 503 504 /5xx.html; 

location ~ /(?:40[345]|5xx)[.]html$ { 
    root /var/www/default/error; 
} 

Se il suddetto, ottengo sempre gli errori di default 404 nginx. Le corrispondenze tra stringhe (senza operatore) e le corrispondenze esatte (operatore =) funzionano, ma con l'operatore di regex sensibile al caso [in] (~[*]) non funziona.

Suppongo che il problema sia l'ordine in cui i blocchi di posizione vengono elaborati.

Esiste comunque una soluzione per ridurre la ridondanza non necessaria root?

risposta

76
error_page 403 /error/403.html; 
error_page 404 /error/404.html; 
error_page 405 /error/405.html; 
error_page 500 501 502 503 504 /error/5xx.html; 

location ^~ /error/ { 
    internal; 
    root /var/www/default; 
} 
+15

Ottima soluzione. Nel caso in cui qualcuno sia totalmente nuovo a questo, si noti che è ancora necessario creare la cartella "errore" all'interno di/var/www/default – Frug

+6

... o usare 'alias' invece di' root', e quindi i file verranno letti direttamente da '/ var/www/default /', invece di '/ var/www/default/error /'. – m4tx

+0

Volevo un blocco server che rispondesse a tutti i nomi di server ** non ** configurati (ad esempio, per esempio, all'indirizzo IP verrà pubblicata una pagina 404). Voglio che quella pagina sia personalizzata. Ho scritto: 'ascolta 80 default_server; nome_server predefinito; ritorno 404; error_page 404 /errors/404.html; posizione^~/errors/{internal; root/var/www; } '. Ricevo ancora la pagina di errore nginx 404 di default. 'Restituisce 404;' funziona con pagine personalizzate? – Kitet

Problemi correlati