Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: RewriteCond %{QUERY_STRING}
 
 автор: Лена   (10.01.2009 в 23:52)   письмо автору
 
 

Ссылки имеют вид: add/index.php?page_id=23&foto=24_asd
А нужно, чтобы было так: index/23/24_asd

Делаю так:

Options +FollowSymlinks 
RewriteEngine on
RewriteBase /add
RewriteRule ^.htaccess$ - [F]
RewriteCond %{QUERY_STRING} ^page_id=([0-9]+)&foto=([_A-Za-z0-9]+)$
RewriteRule ^add/index.php$  add/index/%1/%2 [L]

  Ответить  
 
 автор: sl1p   (11.01.2009 в 07:01)   письмо автору
 
   для: Лена   (10.01.2009 в 23:52)
 

RewriteEngine on
RewriteBase /
RewriteRule ^add/index/(\d+)/([[:alnum:]_]+)/?$ add/index.php?page_id=$1&foto=$2 [L]

http://domain.com/add/index/23/24_asd
->
http://domain.com/add/index.php?page_id=23&foto=24_asd

  Ответить  
 
 автор: Лена   (11.01.2009 в 15:47)   письмо автору
 
   для: sl1p   (11.01.2009 в 07:01)
 

Модуль должен работать только в папке add, а не на всем сервере.
Если от корня, то все получается:

Options +FollowSymlinks  
RewriteEngine on 
RewriteBase /
RewriteRule ^.htaccess$ - [F] 
RewriteCond %{QUERY_STRING} ([0-9]+)/([_A-Za-z0-9]+)
RewriteRule ^rewrite\.php?$  rewrite.php?page_id=%1&foto=%2 [L] 

  Ответить  
 
 автор: xx7   (11.01.2009 в 18:31)
 
   для: Лена   (11.01.2009 в 15:47)
 

впринципе особой разницы нет , написать-ли
RewriteBase /add/
RewriteRule ^index/.....
или написать
RewriteBase /
RewriteRule ^add/index/.....

RewriteCond %{QUERY_STRING} ([0-9]+)/([_A-Za-z0-9]+)
означает что идущее за ним правило RewriteRule будет проверяться только если после знака вопроса (?)
в адресе будут присутствовать цифр(а|ы) / и ещё например цифра
для обработки запросов типа /add/index/1/1/ это совсем не обязательно,
если нужны так-же другие GET - параметры , просто можно добавить флаг [QSA] к RewriteRule

или вы не хотите чтобы /add/index.php?page_id=23&foto=24_asd тоже отдавался этот /add/index.php
, а только на запрос index/23/24_asd ?

// всегда стараюсь применять [R] , на стадии проверки работы (можно хоть в адресной строке посмотреть на какой-же конкретно запрос изменяется)
//
попробуйте например
RewriteBase /add/
RewriteRule ^index/([0-9]+)/([0-9]+)_asd/?$ index.php?page_id=$1&foto=asd_$2 [L,QSA,R]
только не проверял , могут быть ошибки

  Ответить  
 
 автор: Лена   (12.01.2009 в 00:19)   письмо автору
 
   для: xx7   (11.01.2009 в 18:31)
 

>или вы не хотите чтобы /add/index.php?page_id=23&foto=24_asd тоже отдавался этот /add/index.php
, а только на запрос index/23/24_asd ?

Не поняла, про что вы меня спрашиваете.

>// всегда стараюсь применять [R] , на стадии проверки работы
Чтобы посмотреть, что получается, я скрипт маленький составила:

<?php
if($_GET['page_id']&&$_GET['foto']){
echo 
"Все в порядке";
}else{
$foto "<a href='?23/24_asd'>Галерея работ</a><br>";
echo 
$foto;
}
?>

  Ответить  
 
 автор: xx7   (12.01.2009 в 01:19)
 
   для: Лена   (12.01.2009 в 00:19)
 

> if($_GET['page_id']&&$_GET['foto']){
это вызовет предупреждение типа Notice, даже два,) в случае если включён вывод таких предупреждений , и не установлены эти переменные , и наоборот не сработает , если $_GET['page_id'] == 0,
и вдруг на самом деле ещё чего непредвиденного добавляется в фактически получившийся запрос
, тогда без [R] никак :)

Насчёт того , это так, не вопрос , как-бы увлёкся мыслями :) просто по старым привычным запросам с кучей названий переменных , всёравно можно будет достать то что и по новым, человеко-понимаемым ;)

  Ответить  
 
 автор: Лена   (12.01.2009 в 15:23)   письмо автору
 
   для: xx7   (12.01.2009 в 01:19)
 

[R] сделала, теперь вижу, куда ведет ссылка. :)
Вот это у меня получилось(модуль работает в конкретной папке):

Options +FollowSymlinks  
RewriteEngine on 
RewriteBase /add/
RewriteRule ^.htaccess$ - [F] 
RewriteCond %{QUERY_STRING} ([0-9]+)/([_A-Za-z0-9]+)
RewriteRule ^rewrite\.php?$  rewrite.php?page_id=%1&foto=%2 [L,R] 

А вот ваш вариант с [QSA] почему-то не получается.

  Ответить  
 
 автор: Trianon   (12.01.2009 в 11:11)   письмо автору
 
   для: Лена   (12.01.2009 в 00:19)
 

этот тест не от того метода.
в ссылке знак вопроса.

  Ответить  
 
 автор: Лена   (12.01.2009 в 15:33)   письмо автору
 
   для: Trianon   (12.01.2009 в 11:11)
 

>этот тест не от того метода.
Почему?

>в ссылке знак вопроса.
В ссылке знак вопроса, который показывает, что дальше идет запрос, который передается с помощью GET-метода.

Вообще-то с этой "переделкой" ссылок с одной стороны - для пользователя это удобно, с другой стороны, тот, кто пишет скрипт, может здорово запутаться. Вот, например, есть у меня куча модулей, которые подключаются в зависимости от полученных гет-переменных. И есть у меня ссылки вида: ?23/24/25/26, плюс есть один файл со всеми правилами модреврайта. И как я смогу увидеть, что ссылка ?23/24/25/26 подчиняется какому-то конкретному правилу? Как я смогу увидеть, что вот эта ссылка, допустим, посылает гет-параметр page-id? Получается, чтобы не запутаться, нужно в каждую отдельную папку(папку, где содержатся все скрипты одного модуля) класть одно правило модреврайта, чтобы было видно, какие гет-переменные я получаю.

  Ответить  
 
 автор: Trianon   (12.01.2009 в 16:28)   письмо автору
 
   для: Лена   (12.01.2009 в 15:33)
 

вопрос не является необходимым условием при применении метода GET.
В ЧПУ обычно вопросов не оставляют.
В чем проявляется удобство пользователя - мне не понять. Но это субъективно.

В остальном - согласен.

  Ответить  
 
 автор: xx77   (12.01.2009 в 17:28)   письмо автору
 
   для: Лена   (12.01.2009 в 15:33)
 

похоже совсем ничего уже не понимаю ,) зачем делать ЧПУ такое
, что смогут понять , какое оно не простое У ?
Уберайти этот вопрос оттуда, и всё станет просче , и безо всяких Cond :)

Там кстати не обозначено даже ^ и/или $, b и эти цифра и слово будут искаться не только там где должны-бы. могувт даже если запрос будет таким http://example.org/add/rewrite.php?br=opera+9/27+kruto
Для чего Вам такие запросы ?
пусть лучше фильтруются такие которые просто http://example.org/add/9/27/?zdes._tozhe_mozhno_dobavit.
и там где RewriteRule ^rewrite\.php?$ , p? означает что 'p' или есть , или её нет :)

  Ответить  
 
 автор: Лена   (12.01.2009 в 19:50)   письмо автору
 
   для: xx77   (12.01.2009 в 17:28)
 

>и безо всяких Cond :)
Ладно, сделаю, как вы говорите:

RewriteEngine on 
RewriteBase /add/
RewriteRule ^rewrite/([0-9]+)/([_A-Za-z0-9]+)$ rewrite.php?page_id=$1&foto=$2 [L,QSA,R]


А Cond оставлю про запас :)

  Ответить  
 
 автор: xx7   (12.01.2009 в 22:19)
 
   для: Лена   (12.01.2009 в 19:50)
 

Теперь наверное только стоит убрать [R] ,)
и насчёт QSA, незнаю бывают-ли нужны ещё другие параметры вашему rewrite.php :)

можно теперь ещё попробовать влепить cookie клиенту , так неосторожно набравшему именно ненастоящий адресс , например так
Options +FollowSymlinks 
RewriteEngine On
RewriteBase /add/ 
RewriteRule ^rewrite/([0-9]+)/([_A-Za-z0-9]+)/?$ rewrite.php?page_id=$1&foto=$2 [L,QSA,CO=yes:popal:domain.adres:1440:/]

только добавил /? , чтобы адрес мог заканчиваться на слэш
И почему-то на денвере ничего не смог добиться , не cookie послать , не переменную окружения установить [E=X_PARAM:1]
(Впринципе это может быть как вариант отсеять вызывающих прямой адрес)
на хостинге работает

  Ответить  
 
 автор: Лена   (12.01.2009 в 23:22)   письмо автору
 
   для: xx7   (12.01.2009 в 22:19)
 

Спасибо вам большое за помощь.

>и насчёт QSA, незнаю бывают-ли нужны ещё другие параметры вашему rewrite.php :)
Подождите. Давайте разберемся. Может, оно мне не нужно. Другие параметры, как я поняла, это если в мой запрос будут добавляться еще переменные, типа: rewrite.php?page_id=$1&foto=$2&text=$2. Так или не правильно?

  Ответить  
 
 автор: xx7   (13.01.2009 в 00:01)
 
   для: Лена   (12.01.2009 в 23:22)
 

не совсем.
просто можно будет набрать адрес http://domain.adres/add/rewrite/1/2/?escho=5
и запрос преобразуется в http://domain.adres/add/rewrite.php?page_id=1&foto=2&escho=5


можно конечно сделать например ^rewrite/([0-9]+)/([A-Za-z]+_[0-9]+)/?([0-9]+)?/?$
и принимать запросы как с двумя несуществующими названиями дирректорий , так и с тремя, но это уже другая история :)

  Ответить  
 
 автор: xx7   (13.01.2009 в 00:11)
 
   для: xx7   (13.01.2009 в 00:01)
 

что-то опять меняют в скриптах форума

  Ответить  
 
 автор: Лена   (13.01.2009 в 11:41)   письмо автору
 
   для: xx7   (13.01.2009 в 00:01)
 

>просто можно будет набрать адрес http://domain.adres/add/rewrite/1/2/?escho=5
Все поняла и проверила. Получилось.
Спасибо. Тема закрыта.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования