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
Форумы портала PHP.SU :: Версия для печати :: Снова mod_rewrite..
Форумы портала PHP.SU » Серверное администрирование » Apache и другие веб-серверы » Снова mod_rewrite..

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

1. senneco - 15 Марта, 2009 - 15:15:31 - перейти к сообщению
Проблема заключается в следующем: у меня есть набор некоторых правил, и мне нужно, что бы если ни одно из правил не подошло, выполнилось последнее правило( т.е. выполнился скрипт 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.  

Заранье очень благодарствую!
2. Champion - 15 Марта, 2009 - 17:09:08 - перейти к сообщению
Во-первых, что ты хочешь сказать [\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
3. senneco - 16 Марта, 2009 - 03:45:06 - перейти к сообщению
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, то обманывать его, что такой файл не существует.
4. Champion - 16 Марта, 2009 - 09:27:53 - перейти к сообщению
senneco пишет:
\w (опять же, если не ошибаюсь) обозначает примерно следующее: все буквы, цифры и символ "_".
Это праильно, но [\w] означает любой из 2 символов \ или w.

senneco пишет:
И, соответственно, нужно, что бы когда он ввёл сразу адрес aaa.php, то обманывать его, что такой файл не существует.
Ты и не будешь его обманывать, ему просто откроется ааа.php. Ну и к последней строчке можешь добавить остальные 2 твоих
5. senneco - 16 Марта, 2009 - 11:43:54 - перейти к сообщению
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.: Посмотрел на свой первый пост, и мне сайчас кажется, что я неправильно сформулировал вопрос, извиняюсь
6. Champion - 16 Марта, 2009 - 11:56:15 - перейти к сообщению
senneco пишет:
А может нужно заэкранировать \, что бы получилось именно "любой из двуз символов \ и w"(типа \\w)? Или я совсем не понял регулякри?)
Заметь разницу: (\w) и [\w]. В первом случае - то, что тебе надо любой символ, который может присутсвовать в слове.
senneco пишет:
у меня есть набор некоторых правил, и мне нужно, что бы если ни одно из правил не подошло, выполнилось последнее правило( т.е. выполнился скрипт aaa.php)
Если ни одно из правил не подошло, то выполняется ааа.php - так и будет, если aaa.php - это ErrorDocument.
senneco пишет:
А мне нужно наоборот - чтобы если ввели aaa.php, то сказать, что файл не найден, хотя на самом деле aaa.php существует.
Теперь совсем не понял.
Попробуй объяснить еще раз сначала вот так:
-пользователь ввел такое - получил такое;
-пользователь ввел такое - получил такое;
7. IOpeH - 16 Марта, 2009 - 14:15:47 - перейти к сообщению
Champion пишет:
Теперь совсем не понял.

он заблочить файл хочет
8. Champion - 16 Марта, 2009 - 15:26:06 - перейти к сообщению
Заблочить файл
CODE (text):
скопировать код в буфер обмена
  1. <Files файл>
  2. order allow,deny
  3. deny from all
  4. </Files>
Но ему по-моему, не это надо...
9. senneco - 17 Марта, 2009 - 07:43:04 - перейти к сообщению
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 , иначе уже смотреть под какое правило подходит адрес
10. Champion - 17 Марта, 2009 - 08:50:16 - перейти к сообщению
Во-первых что за if-else-else.
Что-то ты мудришь. Запрети все файлы, кроме index.php, как я написал предыдущим постом. Пропиши правило
RewriteRule ^(\w+)$ index.php?action=$1
А на ошибку 403 (которая возникнет из-за того, что ты запретил все файлы) поставь error.php: ErrorDocument 403 /error.php
11. valenok - 17 Марта, 2009 - 11:20:27 - перейти к сообщению
немного не в тему, но как выполнить правило если не одно не подошло:
всем правилам поставить флаг [L] Last так чтоб остальные правила если это подошло не выполнялись
и самым последним поставить свое правило которое соответствует чему угодно.
12. senneco - 17 Марта, 2009 - 12:09:45 - перейти к сообщению
Champion пишет:
Во-первых что за if-else-else.

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

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

Это, наверно, как раз то, что мне нужно ) Пробовал добалять к концу каждого правила [L] - не помогает, к сожалению.
13. Champion - 17 Марта, 2009 - 12:35:50 - перейти к сообщению
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>
14. senneco - 17 Марта, 2009 - 19:11:13 - перейти к сообщению
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.  

и оно ожило!)

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

Но всё-таки хотелось бы узнать, как выполнить правило только в том случае, если ни одно другое не подошло.
15. Champion - 18 Марта, 2009 - 08:57:14 - перейти к сообщению
Да, я с маску коряво написал. Ошибся.
senneco пишет:
как выполнить правило только в том случае, если ни одно другое не подошло
Пост Valenkа. Попробуй по внимательнее, наверное где-нибудь странность написал

 

Powered by ExBB FM 1.0 RC1