mod_rewrite 应该为文档根目录中存在的文件提供服务,但却忽略了它们

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 上的挂载目录,而服务请求的 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>

相关内容