Правило 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 существует