Теряется переменная в mod_rewrite

Superior
На сайте с 20.02.2008
Offline
120
1514

Есть страницы вида http://www.site.ua/razdel/page.shtml?20080915_1

Необходимо, чтобы открывалась страница вида

http://www.site.ua/razdel/index.php?p=page&id=20080915_1

Пробовал такую запись в .htaccess:

RewriteEngine on

RewriteBase /razdel/

RewriteRule ^(.*)\.shtml?(.*)$ index.php?p=$1&id=$2 [L]

но переменная после вопросительного знака теряется и не передается. Как сделать, чтобы работало?

KeTal
На сайте с 25.08.2005
Offline
54
#1
Superior:
RewriteRule ^(.*)\.shtml?(.*)$ index.php?p=$1&id=$2 [L]

Попробуйте экранировать знак вопроса.

Superior:
RewriteRule ^(.*)\.shtml\?(.*)$ index.php?p=$1&id=$2 [L]
Night Man
На сайте с 24.12.2008
Offline
17
#2

Хе..а я сижу думаю почему второй знак вопроса не обрабатывается.))

Услуги веб-разработчика (/ru/forum/481646) Большое количество восклицательных знаков- явный признак больного ума.(с)
Superior
На сайте с 20.02.2008
Offline
120
#3
KeTal:
Попробуйте экранировать знак вопроса.

Если экранировать, вообще не срабатывает и отдает 404 ошибку - страница не найдена. Без экранирования знака вопроса перенаправляет на нужную страницу, но переменной (которая после знака вопроса в исходном url) нет.

[Удален]
#4

скрипт вообще определяет переменную? скрипт в студию кинь, так я думаю никак вопрос не решить, скорее проблема в скрипте, в правилах нужно четко указать переменные. А так он будет выполнять тоже самое.

edogs software
На сайте с 15.12.2005
Offline
775
#5

Не в этом дело. "Строка запроса" (то что идет после ?) не является частью пути к имени файла и RewriteRule не обрабатывается (RewriteRule сам по себе обрабатывает только имя файла), поэтому и в скрипт параметры запроса не передаются.

Если нужна строка запроса, используйте %{QUERY_STRING}

На Ваш пример экстраполировать не хочется, но смысл в чем.


.htaccess
RewriteEngine on
RewriteRule ^(.*html)$ index.php?q=%{QUERY_STRING} [L]


index.php
print_r($_REQUEST);

при запросе a.html?ddd=fff

выдаст Array ( [q] => ddd=fff )

P.S.: Для Вашего случая придется видимо или разбирать строку запроса внутри скрипта (что самое разумное) или использовать условия в mod_rewrite по строке запроса

RewriteCond %{REQUEST_URI} или RewriteCond %{QUERY_STRING}

например


RewriteEngine on
RewriteCond %{QUERY_STRING} ddd
RewriteRule ^(.*html)$ index.php?q=%{QUERY_STRING} [L]

будет срабатывать только если в строке запроса встретится ddd

P.P.S.: (что-то нас расперло:))

попробуйте такой код ( http://zc.tj/mr/page.shtml?20080915_1 пример работы )


RewriteEngine on
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(page.shtml)$ index.php?p=page&id=%1 [L]

(естественно .htaccess куда надо кладите... или правила под свои пути правьте, и не будет 404 ошибки :))

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
KeTal
На сайте с 25.08.2005
Offline
54
#6
Superior:
RewriteRule ^(.*)\.shtml?(.*)$ index.php?p=$1&id=$2 [L,QSA]

а если так попробовать, что получится?

Superior
На сайте с 20.02.2008
Offline
120
#7
KeTal:
а если так попробовать, что получится?

RewriteRule ^(.*)\.shtml?(.*)$ index.php?p=$1&id=$2 [L,QSA]

Так тоже не получается - переменной нет

Superior добавил 17.01.2009 в 03:25

edogs:
Не в этом дело. "Строка запроса" (то что идет после ?) не является частью пути к имени файла и RewriteRule не обрабатывается (RewriteRule сам по себе обрабатывает только имя файла), поэтому и в скрипт параметры запроса не передаются.
Если нужна строка запроса, используйте %{QUERY_STRING}
На Ваш пример экстраполировать не хочется, но смысл в чем.

.htaccess
RewriteEngine on
RewriteRule ^(.*html)$ index.php?q=%{QUERY_STRING} [L]


index.php
print_r($_REQUEST);

при запросе a.html?ddd=fff
выдаст Array ( [q] => ddd=fff )

P.S.: Для Вашего случая придется видимо или разбирать строку запроса внутри скрипта (что самое разумное) или использовать условия в mod_rewrite по строке запроса
RewriteCond %{REQUEST_URI} или RewriteCond %{QUERY_STRING}
например

RewriteEngine on
RewriteCond %{QUERY_STRING} ddd
RewriteRule ^(.*html)$ index.php?q=%{QUERY_STRING} [L]

будет срабатывать только если в строке запроса встретится ddd

P.P.S.: (что-то нас расперло:))
попробуйте такой код

RewriteEngine on
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(page.shtml)$ index.php?p=page&id=%1 [L]

Последний код не работает - 404 ошибка

Superior добавил 17.01.2009 в 03:30

Сработал такой вариант:

RewriteEngine on

RewriteBase /razdel/

RewriteRule ^(.*)\.shtml?(.*)$ index.php?p=$1&id=%{QUERY_STRING} [L]

Всем спасибо за советы!

-
На сайте с 07.12.2005
Offline
97
-K-
#8
Superior:

Сработал такой вариант:

RewriteEngine on
RewriteBase /razdel/
RewriteRule ^(.*)\.shtml?(.*)$ index.php?p=$1&id=%{QUERY_STRING} [L]

Всем спасибо за советы!

Данный вариант не совсем корректный, ибо Ваше правило означает - все что угодно (а может и ничего), затем .shtm потом может быть (а может и не быть l) потом еще все что угодно до конца строки.

Т.е. по правилу пройдут и строчка вида:

/razdel/.shtm

/razdel/324234.shtmFile

и так далее

Более правильный вариант тогда уж:


RewriteCond %{QUERY_STRING} ^[\d_]+$
RewriteRule ^([a-z]+)\.shtml$ index.php?p=$1&id=%{QUERY_STRING} [L]
RU
На сайте с 08.12.2008
Offline
9
#9
Superior:

RewriteEngine on
RewriteBase /razdel/
RewriteRule ^(.*)\.shtml?(.*)$ index.php?p=$1&id=$2 [L]

но переменная после вопросительного знака теряется и не передается. Как сделать, чтобы работало?

RewriteRule ^(.*)\.shtml?(.*)$ index.php?p=$1&id=$2 [L]

заменить на :

RewriteRule ^(.*)\.(shtml)?(.*)$ index.php?p=$1&id=$2 [L]

доступный способ для оплаты ваших услуг (http://www.smsdostup.ru/3137/) Дивная верстка за $10 (/ru/forum/324509)
-
На сайте с 07.12.2005
Offline
97
-K-
#10
Real-Unior:

RewriteRule ^(.*)\.(shtml)?(.*)$ index.php?p=$1&id=$2 [L]

Вы если уж не знаете о чем пишите, то хотя бы попробовали - работает ли такой пример. QueryString в RewriteRule не обрабатывается, а знак вопроса является квантификатором указывающим на 0 или 1 вхождение в шаблоне предваряющего его текста или группы!

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