nginx try_files переписать.html в "чистый" URL
Вот каталог, содержащий статические HTML-файлы
public
|-- index.html
|-- media
| `-- blurred_image-8.jpg
|-- post
| `-- 13considerations
| `-- index.html
Я пытаюсь настроить nginx для преобразования всех URL-адресов, заканчивающихся на .html
вырезать суффикс.
Как это:-
server {
listen 80;
server_name mysite.com;
location / {
root /var/www/mysite/public;
try_files $uri $uri/ $uri/index.html;
}
location /media/ {
alias /var/www/mysite/public/media/;
error_page 404 = /404;
expires 30d;
}
location /static/ {
alias /var/www/mysite/public/static/;
error_page 404 = /404;
expires 30d;
}
}
Это работает правильно для домашней страницы " http://mysite.com/", но если я пытаюсь получить доступ к " http://mysite.com/post/13considerations/", я получаю 500 внутренних ошибок сервера.
Что дает?
1 ответ
Решение
Пример, который вы используете, работает для возврата содержимого каталога index.html
файл, но не будет работать для файлов (например, http://server/somedir/file
не вернет содержимое /somedir/file.html
).
Упрощенная конфигурация, которая вернет любой HTML-файл без его расширения и будет использовать index.html
для каталогов выглядит следующим образом:
server {
listen 80;
server_name mysite.com;
index index.html;
root /var/www/mysite/public;
location / {
try_files $uri $uri/ @htmlext;
}
location ~ \.html$ {
try_files $uri =404;
}
location @htmlext {
rewrite ^(.*)$ $1.html last;
}
}
Как это устроено:
- Определение
index index.html
по умолчанию будет использовать этот файл при обращении к URI каталога. - Ввод
root
внеlocation
Блок будет применяться на всем сервере. try_files $uri $uri/ @htmlext
сначала будет искать точное совпадение для файла или каталога, прежде чем, наконец, попытаться добавить.html
,try_files $uri =404
чтобы предотвратить застревание Nginx в цикле перезаписи, если файл не может быть найден.rewrite ^(.*)$ $1.html last
присоединяет.html
и перезапускает процесс сопоставления URI.