Как скрыть расширение файла в nginx - PullRequest
3 голосов
/ 24 июля 2011

Исходя из опыта работы с Apache, в прошлом я скрывал расширения файлов .html, используя пару правил перезаписи:

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /.+\.html\ HTTP
RewriteRule ^(.+)\.html$ http://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^.+$ %{REQUEST_FILENAME}.html [L]

Возможности переписывания nginx различны, возможное решение лежит здесь 1005 * однако, вики nginx предлагает, если это вообще возможно, избегать ifs - лучшее решение, и обсуждает использование вместо этого (try_files).Мне было интересно, есть ли у кого-нибудь лучший способ реализовать что-то вроде этого, так как:

try_files $uri $uri.html =404;

работает в некоторых случаях, вы получите серьезные проблемы с перенаправлением и т. Д. Есть ли способ избежать ifs в этом случае

1 Ответ

1 голос
/ 17 августа 2012

Вы бы использовали директиву try_files следующим образом:

location / {
  try_files $uri $uri.html =404;
}

это делает следующее для каждого URI, который соответствует блоку местоположения

  1. проверить, есть ли файл с точным соответствием, если так, подайте его
  2. если точное совпадение не найдено, попробуйте добавить .html к запросу
  3. если это не было найдено, либо вернуть 404

в этом нет никакого перенаправления, просто nginx проверяет несколько вариантов по очереди.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^.+$ %{REQUEST_FILENAME}.html [L]

первые 2 строки в основном это 1. и 2. за исключением того, что nginx не нужно переписывать URL, поскольку директива try_files делает его достаточно умным, чтобы просто возвращать запрос, когда совпадение найдено

...