|
|
|
| Доброго времени суток!
Появилась задача с апачем, никак не могу добиться нужного результата.
Требуется добавить в конце всех URL директорий слэш, редиректить все страницы без слеша в конце, на страницы со слешем.
Проблема в том, почти все URL сделаны тоже через RewriteRule.
И вот не знаю, толи я порядок не соблюдаю, но думаю проблема во флагах, в общем получается, что страница редиректится сначала, по моему правилу, а затем по предыдущему, т.е. получается два редиректа на странице!
Выглядит это все в htaccess примерно так:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]
RewriteRule ^tratata/?$ /querty/?q=430 [L]
RewriteRule ^tratata2/?$ /querty/?q=432 [L]
......
|
И получаю такие заголовки c одной страницы:
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Mar 2012 15:36:07 GMT
Server: Apache/1.3.37 (Unix) PHP/5.2.10
Location: http://site.ru/tratata/qwerty/
|
...
HTTP/1.1 301 Moved Permanently
Date: Mon, 12 Mar 2012 15:36:07 GMT
Server: Apache/1.3.37 (Unix) PHP/5.2.10
Location: http://www.site.ru/tratata/querty/?q=423
|
...
HTTP/1.1 200 OK
Date: Mon, 12 Mar 2012 15:36:07 GMT
Server: Apache/1.3.37 (Unix) PHP/5.2.10
X-Powered-By: PHP/5.2.10
|
В апаче не силен, поэтому прошу сразу ткнуть носом куда копать и как можно исправить.
Задача срочная! Пожалуйста помогите! | |
|
|
|
|
|
|
|
для: MHz
(12.03.2012 в 19:48)
| | Посмотрите эту тему | |
|
|
|
|
|
|
|
для: Sfinks
(12.03.2012 в 21:42)
| | В той теме как я понял у человека не работало само правило преобразования. У меня это правило работает, только оно конфликтует с другими преобразованиями. | |
|
|
|
|
|
|
|
для: MHz
(12.03.2012 в 22:21)
| | А вы попробовали?
Исправьте ваши правила:
RewriteRule ^tratata/?$ /querty/?q=430 [L]
RewriteRule ^tratata2/?$ /querty/?q=432 [L]
| чтоб они на конкретные файлы перенаправлялись и были обязательно со / в конце, а дописывание / с внешним редиректом вставьте почти в конец htaccess. Тогда при вводе урл без / все редиректы будут игнориться, под конец дописываться слеш, внешний релирект и повторный проход правил..... Теперь подходящее правило будет подобрано, REQUEST_FILENAME будет с расширением на конце и дописывание слеша проигнорируется. | |
|
|
|
|
|
|
|
для: Sfinks
(12.03.2012 в 23:24)
| | Честно не уверен что понимаю. Только осваиваю mod_rewrite.
Получается, исправляем правило чтобы оно имело вид
RewriteRule ^text/$ /querty/?q=430 [L]
|
Т.е. если я правильно понимаю, убираем "?", слеш в конце становится обязательным.
Если на сервер приходит запрос site.ru/text без слеша в конце, то написаное выше правило уже не подойдет.
В конце добавляем правило
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]
|
Т.е. если в запрос не содержит ссылку на файл, проверяется наличие слеша в конце запроса, далее в конец запроса добавляется слеш и апач снова проходит по файлу и правило которое писал в верху поста уже должно подойти?
Я правильно понимаю алгоритм? Еще не пойму, внешний редирект будет происходить сразу или после прохода по всем правилам?
Сейчас попробую что-нибудь исправить | |
|
|
|
|
|
|
|
для: MHz
(13.03.2012 в 00:53)
| | Блин, не получается ничего(( Не знаю что я неправильно делаю, не пойму где все начинает не так работать =( и RewriteLog оказывается только через httpd.conf можно включить, доступа к которому нету. | |
|
|
|
|
|
|
|
для: MHz
(13.03.2012 в 01:06)
| | Покажите .htaccess полностью, если можно? | |
|
|
|
|
|
|
|
для: MHz
(13.03.2012 в 01:06)
| | кстати после RewriteEngine On укажите RewriteBase /
и в
RewriteRule ^text/$ /querty/index.php?q=430 [L]
| первый слеш писать не нужно. Т.е.
RewriteRule ^text/$ querty/index.php?q=430 [L]
|
| |
|
|
|
|
|
|
|
для: MHz
(13.03.2012 в 00:53)
| | Вот сделаете вы, например через пол года, например смену шкурок на сайте (или любой динамически генерирующийся ява-скрипт или еще что-то не стационарное), но захотите чтоб пользователь не видел где и как это происходит.... И напишите вы правило, например:
RewriteRule style.css style.css.php?version=11
| и не будет оно работать )
Потому что правила
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]
| допишут к нему слеш, и будет у вас style.css.php/?version=11
Поэтому правила дописывания слеша берите из вышеуказанной темы. А
RewriteRule ^text/$ /querty/?q=430 [L]
| лучше исправить на конкретное
RewriteRule ^text/$ /querty/index.php?q=430 [L]
|
В остальном верно )
> Еще не пойму, внешний редирект будет происходить сразу или после прохода по всем правилам?
после. Но они ни одно не подойдут. А если подойдут, значит к ним слеш не надо дописывать. | |
|
|
|