Переписать правило для добавления расширения .html - PullRequest
12 голосов
/ 21 апреля 2011

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

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

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

Ссылки категории не изменились и все так domain.com/category/ (с косой чертой)

Ответы [ 7 ]

16 голосов
/ 08 октября 2012

Ответ от @ 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)$
8 голосов
/ 25 февраля 2013

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

Options FollowSymLinks

RewriteEngine On
RewriteCond %{REQUEST_URI} !^.*\.html$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html
4 голосов
/ 21 апреля 2011
RewriteEngine On
RewriteCond %{REQUEST_URI} ! \.html$
RewriteCond %{REQUEST_URI} ! /$
RewriteRule ^(.*)$ $1.html

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

3 голосов
/ 11 апреля 2016

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

RewriteEngine On

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

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

3 голосов
/ 26 марта 2014

Ответ от @ 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
1 голос
/ 12 февраля 2013

Вышеуказанные решения не сработали,
Я нашел рабочее решение по адресу:
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]

0 голосов
/ 27 декабря 2016

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

принудительное расширение .html

if ($request_filename !~ ^.+(.html|\/)$) {
    return 301 $scheme://$host$request_uri.html;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...