У меня есть конфигурация nginx примерно с 10 vhosts, и я хочу, чтобы все они совместно использовали пользовательские страницы 404 и 50x и ошибки обслуживания. Nginx - это обратный прокси, обслуживающий angular index.html, и я немного запутался в том, как получить error_page 404 /oops/root
директива для получения ресурсов шрифтов и изображений в каталоге, отличном от самого веб-сайта (не может указывать на каталог веб-сайта, если корень сайта возвращает 404).
Если по какой-либо причине корень приложения приводит к ошибке 404, я бы хотел показать пользовательский index.html внутри /usr/share/nginx/html/oops
каталог и иметь возможность указывать на oops / fonts / * и oops / image.svg и pngs.
Все работает нормально, кроме ассетов. Страница 404 отображается, но изображения и шрифты не имеют правильного пути. Кажется, не видно в журналах уровня отладки nginx, как заставить их появиться.
upstream notbrain-api {
server 192.168.1.2:3000;
}
server {
access_log /var/log/nginx/access.log human_json;
error_log /var/log/nginx/error.log debug;
listen 443 ssl;
server_name notbrain.com;
include /etc/nginx/ssl/shared_ssl.nginx;
# font cache fix
location ~* \.(?:woff|eot|ttf|otf) {
root "/usr/local/apps/notbrain.com/dist";
proxy_cache STATIC;
proxy_cache_valid 200 7d;
add_header Vary Accept-Encoding;
add_header Cache-Control public;
}
# proxy to upstream api host
location /api {
proxy_connect_timeout 60;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
expires -1;
add_header Cache-Control "no-store";
proxy_pass http://notbrain-api;
}
location / {
root "/usr/local/apps/notbrain.com/dist";
index index.html;
try_files $uri $uri/ /index.html =404;
expires -1;
add_header Cache-Control "no-store";
}
location ~ \.(aspx|php|jsp|cgi|do|rb)$ {
return 410;
}
# currently working for 404.html, but can't figure out how to point assets to snafu/
# would like to avoid having to explicitly rewrite all images and fonts
#
error_page 404 /snafu/404.html;
location /snafu/ {
# index and assets are inside /usr/share/nginx/html/snafu/[fonts/, images/]
root "/usr/share/nginx/html/";
}
}
Выяснилось, что это пара обходных путей, которые мешают работе новой строфы error_page.
Сначала я использовал alias
вместо того root
в совпадении местоположения error_page:
...
error_page 404 /snafu.html/404.html;
location /snafu.html/ {
alias "/usr/share/nginx/html/snafu.html/";
}
...
Затем в HTML всех страниц с ошибками я поставил перед всеми ресурсами префикс /snafu.html/
(шрифты и изображения).
Оставшаяся проблема заключалась в отсутствии шрифтов, поскольку у нас был обходной путь для проблемы с кешированием веб-шрифтов, которая без необходимости объявляла root
:
location ~* \.(?:woff|eot|ttf|otf) {
root "/usr/local/apps/notbrain.com/dist";
proxy_cache STATIC;
proxy_cache_valid 200 7d;
add_header Vary Accept-Encoding;
add_header Cache-Control public;
}
Вышеупомянутое было теперь слишком агрессивным и перехватывало все запросы шрифтов и установка корня для основного сайта (который находится в состоянии 404). Это должно было работать как для страниц с ошибками, так и для самого сайта. Удаление root
и расширение регулярного выражения, чтобы оно соответствовало обоим исправлениям:
location ~* ^(.+/)?fonts/(.+)\.(?:woff|woff2|eot|ttf|otf)$ {
proxy_cache STATIC;
proxy_cache_valid 200 7d;
add_header Vary Accept-Encoding;
add_header Cache-Control public;
}
Я уверен, что есть более элегантный способ выразить ^(.+/)?fonts/(.+)
но это, похоже, сработало.
Я не уверен, почему уборщица ^(.+)?/fonts/(.+)\.(?:woff|woff2|eot|ttf|otf)$
регулярное выражение не работает - я намерен всегда иметь перед ним косую черту, но необязательный каталог. Это потому что .+
никогда не совпадает с косой чертой?