Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Снова mod_rewrite..

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Как выполнить правило, если ни одно другое не подошло
senneco
Отправлено: 15 Марта, 2009 - 15:15:31
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Проблема заключается в следующем: у меня есть набор некоторых правил, и мне нужно, что бы если ни одно из правил не подошло, выполнилось последнее правило( т.е. выполнился скрипт aaa.php). Привожу свой файл .htaccess:
CODE (text):
скопировать код в буфер обмена
  1. AddDefaultCharset UTF-8
  2. RewriteEngine on
  3. RewriteRule ^([\w]+)/*$ index.php?action=$1
  4. RewriteRule ^([\w]+)/([\w]+)/*$ index.php?action=$1&item=$2
  5. RewriteRule ^([\w]+)/([\w]+)/([\w]+)/*$ index.php?action=$1&item=$2&id=$3
  6. RewriteRule ^(.*)$ aaa.php
  7.  

Заранье очень благодарствую!
 
 Top
Champion Супермодератор
Отправлено: 15 Марта, 2009 - 17:09:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Во-первых, что ты хочешь сказать [\w] вот этим? А во-вторых, в твоем случае, по-моему можно aaa.php выдавать на 404 ошибку. И всё будет как тебе надо:
CODE (text):
скопировать код в буфер обмена
  1. ErrorDocument 404 /aaa.php
  2. RewriteEngine on
  3. RewriteRule ^(\w+)/(\w+)/(\w+)$ index.php?action=$1&item=$2&id=$3
 
 Top
senneco
Отправлено: 16 Марта, 2009 - 03:45:06
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Champion пишет:
Во-первых, что ты хочешь сказать [\w] вот этим? А во-вторых, в твоем случае, по-моему можно aaa.php выдавать на 404 ошибку. И всё будет как тебе надо:
CODE (text):
скопировать код в буфер обмена
  1. ErrorDocument 404 /aaa.php
  2. RewriteEngine on
  3. RewriteRule ^(\w+)/(\w+)/(\w+)$ index.php?action=$1&item=$2&id=$3

1. На сколько знаю, mod_rewrite использует perl'овые регулярные выражения, а по их правилам \w (опять же, если не ошибаюсь) обозначает примерно следующее: все буквы, цифры и символ "_".
2. К сожалению такой способ у меня не прокатит.. У меня структура такая: если пользователь открывает страницу index.php?action=aaa, то ему открывается файлик aaa.php, допустим. И, соответственно, нужно, что бы когда он ввёл сразу адрес aaa.php, то обманывать его, что такой файл не существует.
 
 Top
Champion Супермодератор
Отправлено: 16 Марта, 2009 - 09:27:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




senneco пишет:
\w (опять же, если не ошибаюсь) обозначает примерно следующее: все буквы, цифры и символ "_".
Это праильно, но [\w] означает любой из 2 символов \ или w.

senneco пишет:
И, соответственно, нужно, что бы когда он ввёл сразу адрес aaa.php, то обманывать его, что такой файл не существует.
Ты и не будешь его обманывать, ему просто откроется ааа.php. Ну и к последней строчке можешь добавить остальные 2 твоих
 
 Top
senneco
Отправлено: 16 Марта, 2009 - 11:43:54
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Champion пишет:
Это праильно, но [\w] означает любой из 2 символов \ или w.

А может нужно заэкранировать \, что бы получилось именно "любой из двуз символов \ и w"(типа \\w)? Или я совсем не понял регулякри?)

Champion пишет:
Ты и не будешь его обманывать, ему просто откроется ааа.php. Ну и к последней строчке можешь добавить остальные 2 твоих

Так если написать
CODE (text):
скопировать код в буфер обмена
  1. ErrorDocument 404 /aaa.php
  2. RewriteEngine on
  3. RewriteRule ^(\w+)/(\w+)/(\w+)$ index.php?action=$1&item=$2&id=$3
  4.  

, то получится, что если страница не найдена, тогда открыть aaa.php. А мне нужно наоборот - чтобы если ввели aaa.php, то сказать, что файл не найден, хотя на самом деле aaa.php существует.

P.S.: Посмотрел на свой первый пост, и мне сайчас кажется, что я неправильно сформулировал вопрос, извиняюсь
 
 Top
Champion Супермодератор
Отправлено: 16 Марта, 2009 - 11:56:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




senneco пишет:
А может нужно заэкранировать \, что бы получилось именно "любой из двуз символов \ и w"(типа \\w)? Или я совсем не понял регулякри?)
Заметь разницу: (\w) и [\w]. В первом случае - то, что тебе надо любой символ, который может присутсвовать в слове.
senneco пишет:
у меня есть набор некоторых правил, и мне нужно, что бы если ни одно из правил не подошло, выполнилось последнее правило( т.е. выполнился скрипт aaa.php)
Если ни одно из правил не подошло, то выполняется ааа.php - так и будет, если aaa.php - это ErrorDocument.
senneco пишет:
А мне нужно наоборот - чтобы если ввели aaa.php, то сказать, что файл не найден, хотя на самом деле aaa.php существует.
Теперь совсем не понял.
Попробуй объяснить еще раз сначала вот так:
-пользователь ввел такое - получил такое;
-пользователь ввел такое - получил такое;
 
 Top
IOpeH
Отправлено: 16 Марта, 2009 - 14:15:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 175
Дата рег-ции: Нояб. 2007  


Помог: 0 раз(а)




Champion пишет:
Теперь совсем не понял.

он заблочить файл хочет
 
 Top
Champion Супермодератор
Отправлено: 16 Марта, 2009 - 15:26:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Заблочить файл
CODE (text):
скопировать код в буфер обмена
  1. <Files файл>
  2. order allow,deny
  3. deny from all
  4. </Files>
Но ему по-моему, не это надо...
 
 Top
senneco
Отправлено: 17 Марта, 2009 - 07:43:04
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Champion пишет:
Попробуй объяснить еще раз сначала вот так:
-пользователь ввел такое - получил такое;
-пользователь ввел такое - получил такое;

Вот чётко то, что мне надо:

У меня есть файл index.php примерно следующего содержания:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. if (array_key_exists("action", $_GET))
  3. {
  4.     if ($_GET['action'] == "aaa")
  5.         include_once("aaa.php");
  6.     else
  7.         include_once("bbb.php");
  8. }
  9. else
  10. {
  11.     include_once("ccc.php")
  12. }
  13.  


И когда пользователь вводит адрес http://site[dot]com/aaa mod_rewrite перенаправлял его соответственно на http://site[dot]com/index.php?action=aaa . А если пользователь открывает http://site[dot]com/aaa.php ( или http://site[dot]com/bbb.php или http://site[dot]com/ссс.php или http://site[dot]com/index.php - не важно), то выполнять скрипт error.php, который выводит сообщение, что страница не найдена.
Ещё пробовал сделать так:
Последнее правило в .htaccess такое, что если в адресе присутствует .php, то выполнить какой-то скрипт, например error.php, но в таком случае, даже если введённый адрес подходил под предыдущие правила, а под это нет, то всё равно выполнялся этот скрипт error.php .

Можно выявить другую подзадачу: если в адресе написано .php, тогда выполнить error.php , иначе уже смотреть под какое правило подходит адрес
 
 Top
Champion Супермодератор
Отправлено: 17 Марта, 2009 - 08:50:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Во-первых что за if-else-else.
Что-то ты мудришь. Запрети все файлы, кроме index.php, как я написал предыдущим постом. Пропиши правило
RewriteRule ^(\w+)$ index.php?action=$1
А на ошибку 403 (которая возникнет из-за того, что ты запретил все файлы) поставь error.php: ErrorDocument 403 /error.php
 
 Top
valenok
Отправлено: 17 Марта, 2009 - 11:20:27
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




немного не в тему, но как выполнить правило если не одно не подошло:
всем правилам поставить флаг [L] Last так чтоб остальные правила если это подошло не выполнялись
и самым последним поставить свое правило которое соответствует чему угодно.


-----
Truly yours, Sasha.
 
My status
 Top
senneco
Отправлено: 17 Марта, 2009 - 12:09:45
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Champion пишет:
Во-первых что за if-else-else.

Табуляция не отобразилась - если "приглядеться", то можно увидеть вложенность условий
Champion пишет:
Запрети все файлы, кроме index.php, как я написал предыдущим постом

Да, это было бы решением моей проблемы. Только не получается сделать так, что бы блочились все файлы кроме index.php.
valenok пишет:
немного не в тему, но как выполнить правило если не одно не подошло

Это, наверно, как раз то, что мне нужно ) Пробовал добалять к концу каждого правила [L] - не помогает, к сожалению.
 
 Top
Champion Супермодератор
Отправлено: 17 Марта, 2009 - 12:35:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




senneco пишет:
Табуляция не отобразилась - если "приглядеться", то можно увидеть вложенность условий
Точно. Извини. Кстати, в тегах [php] табуляция сохраняется.
senneco пишет:
Только не получается сделать так, что бы блочились все файлы кроме index.php.

А если
CODE (text):
скопировать код в буфер обмена
  1. <Files "php$")>
  2. order allow,deny
  3. deny from all
  4. </Files>
  5. <Files index.php>
  6. order allow,deny
  7. allow from all
  8. </Files>
 
 Top
senneco
Отправлено: 17 Марта, 2009 - 19:11:13
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Champion пишет:
А если
CODE (text):
скопировать код в буфер обмена
  1. <Files "php$">
  2. order allow,deny
  3. deny from all
  4. </Files>
  5. <Files index.php>
  6. order allow,deny
  7. allow from all
  8. </Files>

Такое не прокатило. По идее же <Files "php$"> означает, что "применить ко всем фалам с маской ...". Но у меня почему-то совсем не хотело работать ни эта маска, ни какая другая. Методом тыка написал-таки
CODE (text):
скопировать код в буфер обмена
  1. <Files *.php>
  2. deny from all
  3. </Files>
  4.  

и оно ожило!)

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

Но всё-таки хотелось бы узнать, как выполнить правило только в том случае, если ни одно другое не подошло.
 
 Top
Champion Супермодератор
Отправлено: 18 Марта, 2009 - 08:57:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Да, я с маску коряво написал. Ошибся.
senneco пишет:
как выполнить правило только в том случае, если ни одно другое не подошло
Пост Valenkа. Попробуй по внимательнее, наверное где-нибудь странность написал
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Apache и другие веб-серверы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB