Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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 существует