我已经从 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 上的挂载目录,而服务请求的 VM 是 Ubuntu 安装。
答案1
尝试%{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>
答案2
我最终添加了另一个重写条件,因此我的工作虚拟主机看起来像这样:
<VirtualHost *:80>
DocumentRoot /var/www/public_html
ServerName domain.com
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^.*\.(php)$ [nocase]
RewriteRule . /index.php
</VirtualHost>