IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Не работает mod_rewrite (https://www.imho.ws/showthread.php?t=104765)

Self Author 12.06.2006 12:12

Не работает mod_rewrite
 
Есть такая задача:
надо из адреса /folder/text?a=1
сделать /folder/?pg=text&a=1
причём параметр a может отсутствовать.

Делаю так:

Код:

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteCond %{REQUEST_URI} ^/[^/]+/[^/?]+.*$
RewriteRule ^([^/]+)/([^/?]+).*$ /$1/?pg=$2&%{QUERY_STRING} [L]

Но Апач виснет. Что делаю не так?

Hubbitus 13.06.2006 10:04

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteCond %{REQUEST_URI} ^/forder/text\?(.*)$
RewriteRule .* /folder/?pg=text&%1 [L]

Поидее так должно работать на вскидку.

А у Вас, без проверки на то что УРЛ уже перезаписывался, просто идет зацикливание преобразования бесконечное.

Self Author 13.06.2006 11:04

Цитата:

Hubbitus:
RewriteCond %{REQUEST_URI} ^/forder/text\?(.*)$
RewriteRule .* /folder/?pg=text&%1 [L]
Нет, без параметров нельзя. Folder и text каждый раз разные.


Цитата:

Hubbitus:
А у Вас, без проверки на то что УРЛ уже перезаписывался, просто идет зацикливание преобразования бесконечное.
Я же специально [L] поставил, чтобы больше ничего не делалось.

Кстати, если в последней строке вместо ([^/?]+) поставить ([a-z]+), то всё работает. Только мне нужно, чтобы были все символы кроме слэша и вопроса.

SergoZD 13.06.2006 11:14

Self Author
Знак вопроса - системный символ в регулярных выражениях, попробуйте его экранировать.

Self Author 13.06.2006 12:51

Цитата:

SergoZD:
Знак вопроса - системный символ в регулярных выражениях, попробуйте его экранировать.
Не в нём проблема.

Так работает:
Код:

RewriteCond %{REQUEST_URI} ^/[^/]+/[^/]+$
RewriteRule ^([^/]+)/([a-z]+)$ /$1/?pg=$2&%{QUERY_STRING} [L]

А так - нет:
Код:

RewriteCond %{REQUEST_URI} ^/[^/]+/[^/]+$
RewriteRule ^([^/]+)/([^/]+)$ /$1/?pg=$2&%{QUERY_STRING} [L]

А надо, чтобы работало во втором варианте, т.к. там в параметре может быть любой символ. А вопрос, кстати, в REQUEST_URI вообще не вылазит, даже если он есть в строке. :) (опытным путём обнаружил).

Hubbitus 13.06.2006 13:01

Цитата:

Self Author:
Я же специально [L] поставил, чтобы больше ничего не делалось.
Дак в этом проходе ничего и не делается, делается в остальных проходах цикла :) Вы читали как работает преобразование вообще??

Попробуйте что-то вроде:
Код:

RewriteCond %{REQUEST_URI} !^\?pg=$
RewriteRule ^([^/]+)/([a-z]+)$ /$1/?pg=$2&%{QUERY_STRING} [L]


kibitzer 13.06.2006 13:39

поставить debug один раз и посмотреть что именно раскрывается и где виснет разве трудно? регулярное выражение у вас в RewriteRule относительно правильное, а вот RewriteCond бессмысленный абсолютно - не надо дублировать RewriteRule, зачем два раза делать? :)

Я бы сделал типа

RewriteCond $2 !^$
RewriteRule ^/([^/]+)/([^/?]+)$ /$1/?pg=$2&%{QUERY_STRING} [L]

будет выполняться только если $2 непустой.

Self Author 13.06.2006 15:11

Заработало!

Рабочий вариант оказался такой:
Код:

RewriteCond %{QUERY_STRING} !pg=
RewriteRule ^([^/]+)/([^/]+)$ /$1/?pg=$2&%{QUERY_STRING} [L]

Проверять REQUEST_URI на параметры бессмысленно, т.к. там остаётся лишь то, что вводится в коммандную строку. А вот QUERY_STRING проверил. И заработало.


Часовой пояс GMT +4, время: 15:00.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.