我有一个非常简单的 .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/