Я поднял большую часть этого из 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>