mod_rewrite маскирование URL не работает - PullRequest
0 голосов
/ 21 октября 2011

У меня есть следующее в моем .htaccess

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^task/(.*)/?$ index.php?mode=task&id=$1 [L]
RewriteRule ^(.*)/?$ index.php?mode=$1 [L]

Если указана последняя строка, независимо от того, что указано в URL-адресе , для $ _GET ['mode'] устанавливается index.php . Без последней включенной строки, или, если я установлю ее, например, на index.php? Mode = home, она работает нормально, но ловушки нет.

Я не вижу, в чем проблема, но, возможно, это что-то простое. Если бы кто-то еще мог уделить мне время, это было бы здорово. Спасибо!

1 Ответ

1 голос
/ 21 октября 2011

Когда вы применяете это, скажем, к /task/123, вот что происходит (при условии, что URI не существует):

  1. передает! -F, / task / 123 isn 't файл, который существует
  2. , передает! -d, / task / 123 не является каталогом, который существует
  3. MATCH против ^task/(.*)/?$, поэтому URI переписывается в index.php?mode=task&id=123
  4. С [L] больше ничего не происходит, и запрос внутренне перенаправляется на index.php?mode=task&id=123
  5. Внутренний редирект возвращает все правила заново <--- это то, что вас облажает </li>
  6. нет совпадения с ^task/(.*)/?$, ничего не делать
  7. СООТВЕТСТВУЕТ ^(.*)/?$, поэтому URI перезаписывается на index.php?mode=index.php
  8. исходный URL, равный перезаписанному URL: index.php, остановить перезапись

Вам нужно добавить условие ко 2-му правилу:

RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^(.*)/?$ index.php?mode=$1 [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...