Nginx try_files не работает с доменом, который добавляет конечный слеш - PullRequest
1 голос
/ 08 марта 2020

У меня есть докеризованное приложение Django, где nginx использует proxy_pass для отправки запросов к Django бэкэнду. Я предпочитаю предварительно опубликовать sh определенные страницы, которые не часто меняются, поэтому Django не приходится иметь с ними дело.

Я пытаюсь использовать try_files, чтобы проверить, существует ли эта страница локально, и перейти к Django если нет.

Наша структура URL-адресов требует, чтобы все URL-адреса заканчивались прямым слэ sh, и мы не используем суффиксы типов файлов, например страница может быть www.example.com/hello/. Это означает, что параметр $ uri в nginx в данном случае равен / hello / и когда try_files смотрит, что он ожидает каталог из-за завершающего sla sh. Если у меня есть каталог со списком файлов, как мне заставить try_files просматривать их, не переписывая URL, чтобы удалить sla sh, как это требуется Django?

My nginx conf ниже.

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name example.com;

    root /home/testuser/example;

    location / {
        try_files $uri uri/ @site_root;
    }

    location @site_root {
       proxy_pass         http://127.0.0.1:12345;
    }
}

Если у меня есть файл "привет" в / home / testuser / example / hello и вызову https://www.example.com/hello/ как я могу получить его для правильной загрузки файла ?

PS все права доступа к папке содержимого stati c и ее содержимому - 777 (на данный момент исключаю проблемы с разрешениями)

Заранее спасибо!

1 Ответ

1 голос
/ 09 марта 2020

Вы можете указать URI /hello/ на локальный файл с именем hello или hello.html, используя try_files, но сначала вы должны извлечь имя файла, используя регулярное выражение location. Подробнее см. в этом документе .

Преимущество использования .html заключается в том, что вам не нужно указывать тип содержимого ответа.

Например, использование hello.html:

root /path/to/root;

location / {
    try_files $uri uri/ @site_root;
}
location ~ ^(?<filename>/.+)/$ {
    try_files $filename.html @site_root;
}
location @site_root {
   proxy_pass  ...;
}

Если вы предпочитаете хранить локальные файлы без расширения, и все они text/html, вам необходимо будет указать Content-Type. Подробнее см. в этом документе .

Например, используя hello:

root /path/to/root;

location / {
    try_files $uri uri/ @site_root;
}
location ~ ^(?<filename>/.+)/$ {
    default_type text/html;
    try_files $filename @site_root;
}
location @site_root {
   proxy_pass  ...;
}
...