#php #.htaccess #mod-rewrite
#php #.htaccess #mod-перезапись
Вопрос:
В моем .htaccess у меня есть следующее
Options FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^task/(.*)/?$ index.php?mode=taskamp;id=$1 [L]
RewriteRule ^(.*)/?$ index.php?mode=$1 [L]
Если включена последняя строка, независимо от того, что помещено в URL, он устанавливает $_GET[‘mode’] в index.php . Например, если я не включу последнюю строку, или если я настрою ее на переход к index.php?mode=home , она работает нормально, но нет общего доступа.
Я не понимаю, в чем проблема, но, вероятно, это что-то простое. Если бы кто-то еще мог найти время, чтобы направить меня правильно, это было бы здорово. Спасибо!
Комментарии:
1. Конечно, эти
RewriteCond
s будут означать, что ничего не соответствует — запрос либо для файла, либо для каталога, вы говорите «не соответствует ни тому, ни другому». Это означает, что последнее правило всегда будет совпадать, потому что первое правило никогда не может совпадать, а последнее правило должно соответствовать чему угодно… Или что-то пропустили?2. -f и -d означают «если файл не существует» и «если каталог не существует» соответственно, afaik, а не «является ли запрос файлом» или «является ли запрос каталогом». Как я уже сказал, без последней строки, или если я установил mode=home в последней строке, все работает нормально.
3. Хорошо, прошу прощения, просто перечитайте документы для
RewriteCond
— никогда не использовал его так много,RewriteRule
обычно мне этого достаточно. Кажется очень странной проблемой — есть ли какой-нибудь способ протестировать это на другом сервере? Я только что попробовал это на локальной установке Apache 2.2.17 / Win32 на моем компьютере, и у меня нет проблемы ($_GET['mode']
заполняется путем, а не сindex.php
)
Ответ №1:
Когда вы применяете это, скажем, /task/123
, вот что происходит (при условии, что URI не существует):
- проходит!-f, /task/123 — это не существующий файл
- проходит!-d, /task/123 не является каталогом, который существует
- СОПОСТАВЛЕНИЕ с
^task/(.*)/?$
, поэтому URI переписывается наindex.php?mode=taskamp;id=123
- С [L] больше ничего не происходит, и запрос ПЕРЕНАПРАВЛЯЕТСЯ на
index.php?mode=taskamp;id=123
- Внутреннее перенаправление повторно применяет все правила <— это то, что вас обманывает
- нет соответствия
^task/(.*)/?$
, ничего не делать - СОПОСТАВЛЯЕТСЯ
^(.*)/?$
, поэтому URI переписывается вindex.php?mode=index.php
- начальный URL-адрес равен перезаписанному URL-адресу: index.php , прекратить переписывание
Что вам нужно сделать, так это добавить условие ко 2-му правилу:
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^(.*)/?$ index.php?mode=$1 [L]
Комментарии:
1. Ах, это имеет смысл. Я не думал об этом так. Кажется, это работает. Спасибо!
2. Кстати, в итоге мне пришлось изменить: RewriteCond %{REQUEST_URI} ! ^/index.php кому : Перезаписать вторую секунду %{REQUEST_FILENAME} !index.php