php - 为什么这个 .htaccess 文件不显示存在的文件?

标签 php apache .htaccess mod-rewrite

我有一个非常简单的 .htaccess 文件,如果该文件不存在且不是目录,它可以将任何请求重定向到 index.php。

[建议修改之前]

<IfModule mod_rewrite.c>
RewriteEngine On

#REWRITE RULES
#---------------------

#RULE COMPLETEREWRITE
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.* index.php

</IfModule>

[建议修改后]

<IfModule mod_rewrite.c>
RewriteEngine On

#REWRITE RULES
#---------------------

#RULE COMPLETEREWRITE
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php [L]

</IfModule>

(htaccess 修改之间没有变化)

此时,无论文件是否存在,它都会重定向到 index.php。谁能解释为什么会这样?

这似乎是个愚蠢的问题 - 但我做了一些研究,结果却很少。

这是在启用了 mod_rewrite 的 Ubuntu 下的 Apache 2.4 中运行的,显然我希望如此。

案例场景:

“/resource/img/panoramas/1.png”中的文件存在。通过本地文件浏览器、SSH 和 FTP 在我的 VM 文件系统上验证。

在实现 htaccess 文件之前,可以远程访问该文件。我有一个缓存版本来证明这一点。

在实现 htaccess 文件后,任何尝试访问此路径都会返回 index.php。

===============

我的 CMS 的核心包含在使用重写时创建 header 的方法。如果我登陆 index.php 本身,我不会标记重写(如预期的那样)。如果我点击该目录下的任何其他路径,我最终会在 index.php 处找到一个重写标志(部分预期)。如果文件存在,则情况不会如此,但仍然会出现与预期相反的情况。

还需要注意的是,这个 htaccess 文件是从 web.config (IIS) 文件自动生成的,在 IIS 下,这些规则和我的 CMS 都完全按预期工作。

最后(与最佳实践相反),将整个目录更改为 777,以消除文件无法访问的可能性。

最佳答案

试试这个:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^.* index.php

这是一个大胆的猜测。如果我们要提供的不仅仅是猜测,您应该启用日志记录并发布日志,因为可能出错的表面很大;)

RewriteLog /var/log/apache2/rewrite.log                                                                                                                                                                      
RewriteLogLevel 5

关于php - 为什么这个 .htaccess 文件不显示存在的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30808524/

相关文章:

.htaccess - HTTPS 与 HTTP 缓存 Javascript 文件?

php - preg_match_all 所有带字边界的组合

apache - Blazor/Kestrel/Apache : How to configure properly?

php - PHP 脚本在 Powershell 写入文件时尝试读取文件的问题

apache - 在 hadoop 集群上使用 HBase 设置 Nutch 2.2.1

.htaccess - 500 内部服务器错误而不是 404

.htaccess - 附加域重定向到 HTTPS

php - 在 POSTMAN 中添加 curl -u

php - 如何连接 MySQL 表

php - 从表中选择所有其他查询未返回结果的表