mod_rewrite и .htaccess - остановить перезапись, если скрипт / файл существует - PullRequest
6 голосов
/ 15 марта 2011

Это мой htaccess:

RewriteEngine On



# Stop if it's a request to an existing file.

RewriteCond %{REQUEST_FILENAME} -f [NC,OR]

RewriteCond %{REQUEST_FILENAME} -d [NC]

RewriteRule .* - [L]



# Redirect all requests to the index page

RewriteRule ^([^/])         /index.php          [L]

Теперь это перенаправляет все в мой скрипт index.php! Это не останавливается, если сценарий существует. У кого-нибудь есть идеи, почему это не работает? Я смотрел везде, но я не совсем понимаю mod_rewrite (как я и думал!).

Проблема возникла из-за того, что я вставил <script> теги, которые указывают на файлы .js в моем веб-каталоге, которые затем перенаправляются в скрипт index.php. Панель инструментов веб-разработчика говорит мне это. :) Если щелкнуть ссылки на js-файлы в окне исходного кода Firefox, также отобразится вывод index.php.

спасибо.

Ответы [ 2 ]

8 голосов
/ 15 марта 2011

Это потому, что после обработки правила перезаписи весь процесс перезапускается с новым URL-адресом. Обработка URL-адреса может проходить через правила снова и снова каждый раз с измененным URL-адресом до тех пор, пока не останется никаких изменений (не найдено правил применения).

Вам нужно это:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)         /index.php          [L]

Не думайте о правилах как о программе, это правила, которые могут накладываться друг на друга и должны быть максимально конкретными для каждого из них.

1 голос
/ 09 января 2015

Полагаю, вам следует добавить [ИЛИ] после первого условия, подобного этому:

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule (.*) $1 [QSA,L]
...