Перепишите лучшие практики index.php - PullRequest
2 голосов
/ 11 ноября 2009

Я заметил, что есть несколько распространенных способов настройки RewriteRule s для PHP-приложений на основе MVC. Большинство из которых содержат:

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d

Далее следует RewriteRule:

RewriteRule ^(.*)$ /index.php?$1 [L,QSA]

или

RewriteRule .* /index.php/$0 [PT,L]

Я понимаю, что L = LAST, QSA = строка запроса добавлена, PT = пройдена, но, поскольку у меня пока нет реального опыта их использования, может кто-нибудь сообщить мне, с какими флагами и URI они пойдут и почему

Последнее правило содержит косую черту перед $ 0, я предполагаю, потому что это заставляет его так, что переменная PATH CGI заполняется, как часто я не вижу, чтобы она заполнялась. Действительно ли PT служит той же цели, что и QSA, косвенно? Или как еще можно использовать строки запроса? Каковы их плюсы и минусы?

И просто для подтверждения, если я хочу добавить, скажем, директиву ErrorDocument, будет ли иметь значение флаг L? Допустим, сделан запрос на '/ non -isting-link /', мое приложение не может забрать его из определенных маршрутов, которые у меня есть, и при этом не существует существующего каталога как такового, L не имел бы никакого эффекта, если бы я разместил ErrorDocument ниже RewriteRule? Должен ли я поместить его перед всем фрагментом? То же самое с 301, 302. И если бы я на самом деле вручную вызывал коды 3xx / 4xx, я бы использовал в своем приложении функцию header(), верно? У меня такое чувство, что это довольно грязно, но, вероятно, это самый практичный и единственный способ сделать это, поэтому, вероятно, это не грязно.

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

Настройка ErrorDocument не будет иметь никакого эффекта. Если Apache не находит файлы, запрос обрабатывается PHP (как определено в этих правилах перезаписи). Оказавшись внутри PHP, вы должны оставаться внутри. Установка для кода ответа значения ошибки с помощью header () не вызовет обработку ошибок Apache. Вы должны создать свой собственный код, чтобы представить приличную страницу с ошибкой.

1 голос
/ 11 ноября 2009

Когда сервер читает htaccess, он переходит к строке, пытаясь найти совпадение. Без флага L он проверит каждое правило в htaccess (хотя я не уверен, что произойдет, если он найдет здесь несколько совпадений).

Если вы включите флаг L, когда он доберется до этого правила, он остановит обработку правил и обработает запрос. Однако здесь есть одна проблема: когда он обрабатывает запрос, он снова обрабатывает файл htaccess с новым, переписанным URL-адресом. Эта страница хорошо объясняет это на примере.

Правило ErrorDocument не будет зависеть от правил перезаписи, поэтому не имеет значения, где оно находится (я обычно помещаю его сверху, поэтому оно очевидно и не скрыто под кучей переписываний).

Однако учтите, что если правило перезаписи соответствует допустимому файлу или сценарию, документ с ошибкой не будет запущен, даже если строка data / query является фиктивной. Например, если URL-адрес записывается в /index.php?page=NON_EXISTENT_PAGE, то сервер считает, что он нашел документ. Вам нужно будет обработать параметр в сценарии PHP. Установка заголовков 404 в сценарии PHP не будет автоматически обслуживать документ 404 (но вы можете включить его из сценария PHP).

1 голос
/ 11 ноября 2009

Я использовал предложение Zend Framework для приложения MVC.

http://framework.zend.com/manual/en/zend.controller.html

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
...