Наразі я налаштовую обробку nginx деякими сторінками помилок та іншими медіа-файлами "за замовчуванням" (такими як favicon.ico та robots.txt), і я зіткнувся з незначною проблемою змусити роботу працювати так, як я хочу на певних сторінках помилок .
В основному, я намагаюся зробити певні файли для сервера під коренем для цього сервера, наприклад /var/www/someserver.com/robots.txt. Якщо цього файлу не існує, я хочу, щоб nginx перейшов до "за замовчуванням", тобто /var/www/default/robots.txt. Це основна суть того, як я конфігурував (успішно):
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Це чудово працює.
Я намагаюся зробити те ж саме для сторінок помилок, але я не в змозі зробити це, хоча:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Зауважте, що це "працює" в тому сенсі, що якщо ви відвідаєте someserver.com/404.html, він спершу спробує завантажити /var/www/someserver.com/404.html, а потім повернеться до / var / www / default /404.html, якщо його не знайдено. Однак якщо ви відвідуєте someserver.com/blahblah, він відображає лише сторінку 404, якщо вона встановлена в /var/www/someserver.com/. Він не повертається до каталогу за замовчуванням, якщо цього файлу не існує.
Так чи інакше, ви, напевно, можете те, що я намагався досягти (тому я включив перший робочий приклад).
Будь-які ідеї?
Редагувати:
Виходячи з відповіді Мартіна Ф, ось що я закінчив скласти:
# 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;
}
}
Це працює приголомшливо. Фактичний блок помилок_сторінок та локацій вище знаходиться у файлі server_defaults.conf, який входить до кожного віртуального хоста, тому я не важко кодував шлях до кожного місця та використовував відносний шлях для значень за замовчуванням.
Редагувати 2:
Такий підхід має проблему. Якщо ви відправляєте POST на URL-адресу, яка повертає помилку, метод запиту POST надсилається із спробами try_files. Це (для мене) призводить до 405 не дозволених помилок, оскільки nginx по суті намагається POST, наприклад, /default/500.html, а не просто отримує цю сторінку.
Редагувати 3:
Я розмістив рішення, яке працює набагато ближче до моєї оригінальної ідеї.