Правило ReWrite для добавления расширения .html

Мне нужно правило, которое добавит расширение .html всякий раз, когда есть "нет" конечной косой черты.

Новый клиент недавно изменил сценарии электронной торговли, и новая версия обрабатывает SEO по-разному и изменила все свои 16 000+ ссылок на продукты. Это не было обнаружено до того, как сайт был повторно проиндексирован, поэтому нам нужно перенаправить старое на новое.

Все продукты, используемые для таких ссылок domain.com/category/productname но сейчас domain.com/category/productname.html

Ссылки на категории не изменились, и все они похожи domain.com/category/(с завершающей косой чертой)

Ответы

Ответ 1

Ответ от @david-wolever перенаправляет все, что не заканчивается на .html(или корень) на тот же URL с добавленным расширением .html, то есть добавляет расширение .html к таким вещам, как файлы CSS и JavaScripts, например он перенаправит /style.css в/style.css.html, что маловероятно, что вы хотите. Он также имеет пробелы после! характер, который, вероятно, вызвал @greggles 500s

Это перенаправляет URL-адреса, которые не заканчиваются точкой, за которой следуют 3 или 4 алфавитно-цифровых символа:

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{3,4}
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ $1.html

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

RewriteCond %{REQUEST_URI} !\.(html|css|js|less|jpg|png|gif)$

Ответ 2

Этот параметр похож на @remco, но не требует использования [R] ( "внешнее" перенаправление, отправленное обратно в brower). Я также добавил отсутствующий\в первом условии:

Options FollowSymLinks

RewriteEngine On
RewriteCond %{REQUEST_URI} !^.*\.html$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html

Ответ 3

RewriteEngine On
RewriteCond %{REQUEST_URI} ! \.html$
RewriteCond %{REQUEST_URI} ! /$
RewriteRule ^(.*)$ $1.html

Возможно, вы захотите выбросить там [R] или что-то еще. См. Docs: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule (поиск "перенаправления | R" ).

Ответ 4

Ответ от @paul.grov.es, похоже, отлично работает для меня, но потом я заметил, что мой javascript больше не работает.

Решение очевидно и упоминается им: к URL-адресу добавлен ".html", учитывая, что расширение javascript имеет только 2 символа.

Итак, мое решение получило:

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{2,4}
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ $1.html

Ответ 5

Это старый поток, но по-прежнему стоит опубликовать рабочий/проверенный ответ на эту проблему:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+?)/?$ /$1.html [L,R=302]

Пропустил условие RewriteCond %{REQUEST_FILENAME} !-f, поскольку шаблон регулярного выражения не соответствует любому URI с точкой в ​​нем.

Ответ 6

Вышеупомянутые решения не сработали для меня,
Я нашел рабочее решение на:
http://www.garron.me/bits/add-html-extension-nginx-apache-htaccess.html
В разделе .htaccess.

RewriteCond% {REQUEST_URI}! ^.. html $RewriteCond % {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule ^ (.) $$ 1.html [L, R = 301]

Ответ 7

Мое решение для nginx:

форсирование расширения .html

if ($request_filename !~ ^.+(.html|\/)$) {
    return 301 $scheme://$host$request_uri.html;
}

Ответ 8

чтобы убедиться, что X.html действительно существует, прежде чем переписывать в него:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html
  • файл условия !-f не существует в соответствии с запросом
  • папка условия !-d не существует в соответствии с запросом
  • Условие -f запрошенный файл с расширением .html существует