Назад | Перейти на главную страницу

mod_rewrite должен обслуживать файлы, которые существуют в корне документа, но игнорирует их

Я поднял большую часть этого из Wordpress, поэтому любой путь в домене, например, /search или /list направлен на /index.php. Прекрасно, что работает.

Однако этого не следует делать, если запрашиваемый файл существует в корне документа. Итак, если я прошу /exists.php он должен запустить этот сценарий. Вместо этого игнорирование файлы в файловой системе и продолжает обслуживать index.php.

<VirtualHost *:80>

  DocumentRoot /home/sites/dev
  ServerName dev.vbox

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule . /index.php

  ErrorLog /var/log/apache2/dev.error.log

</VirtualHost>

Я прошел через документация по mod_rewrite и различные результаты поиска Google, но я не вижу ничего плохого в моих условиях перезаписи. Если запрошенное имя файла является файлом или каталогом, не перенаправляйте на /index.php.

Я cd в корень документа и перечислил содержимое этого каталога, файл, который я запрашиваю, существует. В моем журнале доступа к apache есть записи для /exists.php.

Корень документа - это смонтированный каталог, который находится на моем Mac, а виртуальная машина, обслуживающая запрос, - это установка Ubuntu.

Пытаться %{LA-U:REQUEST_FILENAME} вместо того %{REQUEST_FILENAME}. Префикс LA-U необходим перед отображением запроса в файловую систему.

Редактировать:

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

<VirtualHost *:80>
    DocumentRoot /home/sites/dev
    ServerName dev.vbox

    RewriteEngine On
    RewriteCond %{LA-U:REQUEST_FILENAME} !-d
    RewriteCond %{LA-U:REQUEST_FILENAME} !-f
    RewriteRule .* /index.php

    ErrorLog /var/log/apache2/dev.error.log
</VirtualHost>

В итоге я добавил еще одно условие перезаписи, поэтому мой рабочий виртуальный хост выглядел так:

<VirtualHost *:80>

  DocumentRoot /var/www/public_html
  ServerName domain.com

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !^.*\.(php)$ [nocase]
  RewriteRule . /index.php

</VirtualHost>