Назад | Перейти на главную страницу

nginx vhosts 404 50x пользовательских страниц с активами. Нужно переписать?

У меня есть конфигурация 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)$ регулярное выражение не работает - я намерен всегда иметь перед ним косую черту, но необязательный каталог. Это потому что .+ никогда не совпадает с косой чертой?