301 Редирект всех адресов, которые заканчиваются не на /

Moris

Новичок
301 Редирект всех адресов, которые заканчиваются не на /

Здравствуйте.

Пытаюсь с помощью mod_rewrite сделать следующее:
если запрашиваемый адрес заканчивается не на ".html" и не на "/", то необходимо в конце прибавать слеш / и сделать 301 редирект.

Пишу такое правило:

RewriteCond %{THE_REQUEST} !\.html$
RewriteCond %{THE_REQUEST} !\/$
RewriteRule (.*) http://www.domain.com/$1/ [R=301,L]

для тестирования открываю
http://www.domain.com/a
и файрфокс перенаправляет меня на
http://www.domain.com/a///////////////
(прибавляет слешы до тех пор пока не вылетит ошибка файрфокса)

Третий час мучаюсь с этой проблемой. Чувствую, что какую-то глупейшую ошибку допускаю, но не могу понять где именно.
Надеюсь меня ткнут носом :)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Moris
может стоит перечитать в мане что такое THE_REQUEST?
 

Moris

Новичок
нет, к gif и jpg не будем:) об этом я бы вспомнил, когда сделал работающее перенаправление
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Moris
Мысли есть как сделать чтоб цикла небыло?
 

Moris

Новичок
очевидно правило RewriteCond %{REQUEST_URI} !\/$
не срабатывает и из-за этого выполняется повторный редирект.

я правильно понимаю, что при запросе
http://www.domain.com/category/a
REQUEST_URI будет /category/a ?
 

Moris

Новичок
да, выводит то, что нужно.

но почему тогда при запросе
http://www.domain.com/category/a

редирект происходит на
http://www.domain.com/category.php/?show=a

а не
http://www.domain.com/category/a/
?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
да, выводит то, что нужно.

но почему тогда при запросе
http://www.domain.com/category/a

редирект происходит на
http://www.domain.com/category.php/?show=a

а не
http://www.domain.com/category/a/
?
Включайте отладку реврайта - разбирайтесь

-~{}~ 26.07.07 23:48:

.



RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]
 

Marquis

Новичок
mod_rewrite тут не нужен.
сейчас не могу найти свой вариант но выглядит это примерно следующим образом:

PHP:
if("последние 5 символов строки" != ".html" AND "последний символ строки" != "/")
{
 header("301 ....");
 header("location: FullPath");
 header("connection: close");
 exit();
}
ну а вообще заголовки проще посмотреть на сайтах которые используют подобное перенаправление.

-~{}~ 27.07.07 09:08:

+ в первом заголовке не помню номера ответа, но как заявили СЕОшники ответ нужен "Перемещен на постоянной основе"
 

OZ

Новичок
Moris, обязательно редиректить? Может добавить "/" если его нет и скрипт увидит его таким?
 

Moris

Новичок
Объясню, для чего я хочу сделать редирект:
в error_log сайта стало появляться много ошибок вида "file does not exist". В результате выяснилось, что какие-то поисковые боты не умеют корректно распознавать ссылки на сайте и обрезают слеш на конце каждой ссылки. Естественно, они получают 404.

Я хочу чтобы им выдавался 301 редирект (перемещен на постоянной основе), для того чтобы ошибочные страницы не включались в индекс, а вместо них сканировались страницы со слешами.

В принципе это можно сделать через скрипты, хотя с mod_rewrite, мне кажется, было бы проще
 

Moris

Новичок
Правила есть. Не само собой, конечно, но просто с теми же самыми правилами, если не делать 301 редирект на страницу со слешем такого же поведения нет.

Есть вот такое правило:
RewriteRule ^category/(.*)/$ category.php?show=$1 [L]


Я включил отладку mod_rewrite, как порекомендовал Mr_Max
и вот что происходит


(4) RewriteCond: input='/category/a' pattern='!\/$' => matched
(2) rewrite category/a -> http://www.domain.com/category/a/
(2) explicitly forcing redirect with http://www.domain.com/category/a/
(1) escaping http://www.domain.com/category/a/ for redirect
(1) redirect to http://www.domain.com/category/a/ [REDIRECT/301]
...
(3) applying pattern '^category/(.*)/$' to uri 'category/a/'
(2) rewrite category/a/ -> category.php?show=a
(3) split uri=category.php?show=a -> uri=category.php, args=show=a
(3) add per-dir prefix: category.php -> z:/.../www/category.php
(2) strip document_root prefix: z:/.../www/category.php -> /category.php
(1) internal redirect with /category.php [INTERNAL REDIRECT]
...
(3) strip per-dir prefix: z:/.../www/category.php -> category.php
(3) applying pattern '(.*)' to uri 'category.php'
(4) RewriteCond: input='/category.php' pattern='!\/$' => matched
(2) rewrite category.php -> http://www.domain.com/category.php/
(2) explicitly forcing redirect with http://www.domain.com/category.php/
(1) escaping http://www.domain.com/category.php/ for redirect
(1) redirect to http://www.domain.com/category.php/?show=a [REDIRECT/301]


То есть какой-то внутренний редирект, из-за которого все и происходит
 

Anarki

Новичок
Кстати браузеры обычно кешируют Moved Permanent то бишь 301

Сталкивался с похожей проблемой.
Насколько я понял, apache без / на конце ищет такой файл("a"),
если не находит видимо делает какие-то преобразования внутренние и ищет уже директорию и это конфликтует с mod_rewrite довольно странным образом.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Moris
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]
?
 

Moris

Новичок
Выдает Not Found.

Только зачем проверка, является ли файл директорией?

/category/a/ директорией не является, он дальше обрабатывается mod_rewrite
 
Сверху