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/";
  }

 }
0
задан 24 June 2017 в 02:49
1 ответ

Выяснилось, что это пара обходных путей, которые мешают работе нового раздела error_page.

Первое. , Я использовал псевдоним вместо root в сопоставлении местоположения error_page:

...
error_page 404 /snafu.html/404.html;
location /snafu.html/ {
  alias "/usr/share/nginx/html/snafu.html/";
}
...

Затем в HTML всех страниц с ошибками я поставил перед всеми ресурсами префикс / snafu. html / (шрифты и изображения).

Оставшаяся проблема заключалась в отсутствии шрифтов, поскольку у нас был обходной путь для проблемы с кешированием веб-шрифтов, из-за которой без необходимости объявлялся корень :

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

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

0
ответ дан 24 November 2019 в 04:20

Теги

Похожие вопросы