papers.php?id=1 - > /papers/1 - циклическая ссылка

I7
На сайте с 27.03.2011
Offline
48
1572

Делаю весь сайт папками, то есть хочу, что бы все ссылки были вида /papers/1. Это означает:

1) Редирект для всех, кто захочет зайти на papers.php?xxx на /papers/

2) Директиву на обработку всех запросов /papers/ и /papers/1 скриптом papers.php

Пишу следующее в .htaccess, получаю в браузере циклическую ссылку. Подскажите, в чем проблема?

RewriteEngine On

RewriteBase /

RewriteRule ^papers.php/?$ /papers/$1 [R=301,L]

RewriteRule ^papers/?$ papers.php [QSA,L]

RewriteRule ^papers/([0-9]{0,})/?$ papers.php?id=$1 [QSA,L]

ISTJ - Максим (mydual.ru/types.ihtml?type=ISTJ) Одиноки в толпе друзей? Найдите своего дуала (mydual.ru/from=forums) и откройте мир комфортного общения.
Q
На сайте с 12.09.2010
Offline
4
#1

RewriteEngine on

Options +FollowSymlinks -Indexes

php_flag magic_quotes_gpc off

RewriteBase /

RewriteRule ^papers/([0-9]+)(/?) papers.php?id=$1 [L]

RewriteRule ^papers/(/?) papers.php [L]

[Удален]
#2

ужасная проблема

Ragnarok
На сайте с 25.06.2010
Offline
239
#3
RewriteEngine on

RewriteRule ^papers$ papers.php [L]
RewriteRule ^papers/$ papers.php [L]
RewriteRule ^papers/([0-9]*)$ papers.php?id=$1 [L]
RewriteRule ^papers/([0-9]*)/$ papers.php?id=$1 [L]

разница в закрывающем слэше, чтобы работал как адрес

так и

//TODO: перестать откладывать на потом
I7
На сайте с 27.03.2011
Offline
48
#4
quacrgr:
RewriteEngine on
Options +FollowSymlinks -Indexes
php_flag magic_quotes_gpc off
RewriteBase /

RewriteRule ^papers/([0-9]+)(/?) papers.php?id=$1 [L]
RewriteRule ^papers/(/?) papers.php [L]

Спасибо, но это не решает задачу 1). При запросе по адресу papers.php?xxx редирект на /papers/ не происходит

maldivec
На сайте с 04.11.2008
Offline
160
#5
Infinity7:
Спасибо, но это не решает задачу 1). При запросе по адресу papers.php?xxx редирект на /papers/ не происходит

Ну правильно, вы же убрали редирект )

RewriteBase /

RewriteCond %{QUERY_STRING} id=([0-9]+)

RewriteRule ^(.*)$ /papers/%1? [L,R=301]

RewriteRule ^papers.php$ /papers/ [L,R=301]

RewriteRule ^papers/([0-9]+)(/?) papers.php?id=$1 [L]

RewriteRule ^papers/(/?) papers.php [L]

I7
На сайте с 27.03.2011
Offline
48
#6
maldivec:
Ну правильно, вы же убрали редирект )

RewriteBase /

RewriteCond %{QUERY_STRING} id=([0-9]+)
RewriteRule ^(.*)$ /papers/%1? [L,R=301]

RewriteRule ^papers.php$ /papers/ [L,R=301]

RewriteRule ^papers/([0-9]+)(/?) papers.php?id=$1 [L]
RewriteRule ^papers/(/?) papers.php [L]

Все равно остается циклическая ссылка. И, так же, что делают следующие две строки?

RewriteCond %{QUERY_STRING} id=([0-9]+)

RewriteRule ^(.*)$ /papers/%1? [L,R=301]

gormarket
На сайте с 29.12.2010
Offline
47
#7

Infinity7, попробуйте так:


RewriteEngine On
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^papers.php$ papers/? [L,R=301]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^papers/?$ papers.php [QSA,L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^papers/([0-9]+)/?$ papers.php?id=$1 [QSA,L]

строки

RewriteCond %{ENV:REDIRECT_STATUS} ^$

нужны чтобы не происходило зацикливание (чтоб следующее правило не применялось, если преобразование уже сделано на последнем проходе по .htaccess)

Первые 2 строки не нужны, если выше в .htaccess они уже есть

Вторые 2 строки делают 301 редирект при обращении к papers.php на papers/ , с удалением строки запроса: именно так я понял пункт 1) в топике

Третья и четвертая пары строк делают реврайт на papers.php (без id третья и с id четвертая) при запросе "papers" и "papers/любое_число" с возможным завершающим слешем. При таких обращениях строка запроса добавляется к новому адресу.

Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)
siv1987
На сайте с 02.04.2009
Offline
427
#8

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} (id=([0-9]+))?

RewriteRule ^papers\.php$ /papers/%2? [L,R=301]

RewriteRule ^papers/?$ papers.php [L]

RewriteRule ^papers/([0-9]+)/?$ papers.php?id=$1 [L]

I7
На сайте с 27.03.2011
Offline
48
#9

Спасибо большое всем! Теперь работает.

Условие, которого мне не хватало, что бы избежать зацикливания, это

RewriteCond %{ENV:REDIRECT_STATUS} ^$

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий