jkm

Рейтинг
120
Регистрация
20.02.2014

dma84, при составлении правил важно не забывать, что mod_rewrite запускает обработку запроса снова и снова, до тех пор, пока он не перестанет меняться.

Последнее правило изменит запрос на index.php и Apache запустит цикл обработки запроса заново с первого RewriteRule.

В итоге с любой страницы будет редирект на /index.php/.

Поможет дополнительная проверка RewriteCond %{ENV:REDIRECT_STATUS} ^$

или RewriteCond %{REQUEST_FILENAME} !-f

Тогда поменять RewriteCond %{REQUEST_URI} !^/search

на RewriteRule ^(search)$ /?path=$1 [L,QSA]

И добавить ниже исключение, чтоб не открывалось /search.html

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301,L]

RewriteRule ^(search)$ /?path=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9/_\-]+)$ http://site.com/$1.html [R=301,L]

RewriteCond %{REQUEST_URI} !=/search.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9/_\-]+)\.html$ /?path=$1 [L,QSA]

sercher, нужно поменять местами правила.

ivcou, для исключения достаточно добавить RewriteCond %{REQUEST_URI} !^/search

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !^/search
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9/_\-]+)$ http://site.com/$1.html [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9/_\-]+)\.html$ /?path=$1 [L,QSA]

Вероятно, поставили редирект после подобной конструкции:


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

Нужно просто перенести редирект повыше.

Pingy:
Почему первое правило не отрабатывает на запросах к site.ru/index.php?

https://habrahabr.ru/company/sprinthost/blog/129560/


Первому RewriteRule передается путь от того места, где находится .htaccess, до запрошенного файла. Эта строка никогда не начинается со "/". Последующим RewriteRule передается результат предыдущих преобразований.


RewriteCond %{REQUEST_URI} ^(.*/)index\.(php|html?)$
RewriteRule ^ %1 [R=301,L]

Или так


RewriteRule ^(.*/)?index\.(php|html?)$ /$1 [R=301,L]

После редиректа новый адрес начинается на /cat/ и снова подходит под условие !^/(help|contacts|about)/

/verona/cat/subcat -> /cat/subcat?region=verona -> /subcat?region=cat

Можно дополнительно проверять %{QUERY_STRING} на наличие region.


RewriteCond %{QUERY_STRING} !^region=

RewriteRule ^_(.+?)_?(\.html)$ /$1$2 [R=301,L]

RewriteRule ^(.+)_(\.html)$ /$1$2 [R=301,L]

Или одним правилом.

RewriteRule ^(?|_(.+?)_?|(.+)_)(\.html)$ /$1$2 [R=301,L]
master_jeday:
Есть ряд статических страниц (физически лежат на сервере), которые называются типа cat.html?page=2


<FilesMatch "\.html\?page=\d+$">
ForceType 'text/html; charset=utf-8'
</FilesMatch>

RewriteEngine On

RewriteCond %{QUERY_STRING} ^page=\d+$
RewriteRule ^.*\.html$ $0%\3f%0 [L]
Всего: 750