为什么这个.htaccess文件不呈现存在的文件?

Dig*_*805 7 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>
Run Code Online (Sandbox Code Playgroud)

[建议修改后]

<IfModule mod_rewrite.c>
RewriteEngine On

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

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

</IfModule>
Run Code Online (Sandbox Code Playgroud)

(htaccess修改之间没有变化)

目前,无论文件是否存在,它都会重定向到index.php.任何人都可以解释为什么会这样吗?

这似乎是一个愚蠢的问题 - 但我已经做了一些研究并且发现很少.

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

案例情景:

"/resource/img/panoramas/1.png"中的文件存在.通过本地文件浏览器,SSH和FTP在我的VM文件系统上进行验证.

在实现htaccess文件之前,可以远程访问此文件.我有一个缓存版本来证明它.

实现htaccess文件后,任何尝试命中此路径都会返回index.php.

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

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

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

最后(与最佳实践相反),整个目录被chmod到777,以便消除文件无法访问的可能性.

rol*_*lls 3

尝试这个:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^.* index.php
Run Code Online (Sandbox Code Playgroud)

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

RewriteLog /var/log/apache2/rewrite.log                                                                                                                                                                      
RewriteLogLevel 5
Run Code Online (Sandbox Code Playgroud)

  • 疯狂的猜测并不是一个好主意。请阅读 Apache 文档,其中指出“REQUEST_FILENAME”是“与请求匹配的文件或脚本的完整本地文件系统路径”。它已经包含文档根目录,这就是为什么没有人像您在答案中那样使用它的原因。 (2认同)