Şu anda nginx'in bazı hata sayfalarını ve diğer "varsayılan" medya dosyalarını (favicon.ico ve robots.txt gibi) işlemesini yapılandırıyorum ve bazı hata sayfaları için istediğim şekilde çalışmak için küçük bir problemle karşılaştım .
Temel olarak, yapmaya çalıştığım şey o sunucu için kök altında bir sunucu için belirli dosyaları sunmak, örneğin /var/www/someserver.com/robots.txt. Bu dosya yoksa, nginx "varsayılan", yani /var/www/default/robots.txt gitmek istiyorum. Bu (başarıyla) yapılandırılmış nasıl temel özüdür:
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Harika çalışıyor.
Hata sayfaları için de aynı şeyi yapmaya çalışıyorum ve bunun olmasına rağmen yapamıyorum:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Bunun someserver.com/404.html adresini ziyaret ederseniz, önce /var/www/someserver.com/404.html dosyasını yüklemeyi ve ardından / var / www / default'a geri dönmeyi denemesi anlamında "işe yaradığını" unutmayın. /404.html bulunmazsa. Ancak, someserver.com/blahblah adresini ziyaret ederseniz, yalnızca /var/www/someserver.com/ adresinde ayarlanmışsa 404 sayfasını gösterir. Bu dosya yoksa varsayılan dizine düşmez.
Her neyse, muhtemelen yapmaya çalıştığım şeyi yapabilirsiniz (bu yüzden ilk çalışma örneğini ekledim).
Herhangi bir fikir?
Düzenle:
Martin F'nin cevabına dayanarak, bir araya getirdim:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
Bu harika çalışıyor. Hata_sayfaları ve yukarıdaki konumların gerçek bloğu, her sanal ana bilgisayara dahil edilen bir server_defaults.conf dosyasındadır, bu yüzden her bir konuma giden yolu zor kodlamamıştım ve varsayılanlar için göreceli bir yol kullandım.
Düzenleme 2:
Bu yaklaşımın bir sorunu var. Hata döndüren bir URL'ye POST yaparsanız, POST istek yöntemi try_files girişimleriyle gönderilir. Bu (benim için) bir 405 İzin Verilmez hatasıyla sonuçlanır, çünkü nginx aslında sadece bu sayfayı almak yerine /default/500.html adresine POST göndermeye çalışır.
Düzenleme 3:
Orijinal fikrimden çok daha yakın olan bir çözüm yayınladım.