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

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.

Что дает?

Пример, который вы используете, работает для возврата содержимого каталога 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 block будет применяться ко всему серверу.
  • try_files $uri $uri/ @htmlext сначала будет искать точное совпадение для файла или каталога, прежде чем, наконец, пытаться добавить .html.
  • try_files $uri =404 чтобы предотвратить застревание Nginx в цикле перезаписи, если файл не может быть найден.
  • rewrite ^(.*)$ $1.html last добавляет .html и перезапускает процесс сопоставления URI.