.htaccess htaccess问题-奇怪[或]行为

.htaccess htaccess问题-奇怪[或]行为,.htaccess,.htaccess,我注意到htaccess中的[或]存在一个我不理解的问题。我要做的是将每个不存在的文件和每个.php文件(而不是/index.php)重定向到/404/。根据我的理解,以下两个模块应该做同样的事情: # .htaccess 1 RewriteEngine on # cond 1 RewriteCond %{REQUEST_FILENAME} !-f [OR] # cond 2 RewriteCond %{REQUEST_FILENAME} !index\.php$ # cond 3 Rewri

我注意到htaccess中的[或]存在一个我不理解的问题。我要做的是将每个不存在的文件和每个.php文件(而不是/index.php)重定向到/404/。根据我的理解,以下两个模块应该做同样的事情:

# .htaccess 1
RewriteEngine on

# cond 1
RewriteCond %{REQUEST_FILENAME} !-f [OR]
# cond 2
RewriteCond %{REQUEST_FILENAME} !index\.php$
# cond 3
RewriteCond %{REQUEST_URI} \.php$
# rule 1
RewriteRule [^\.]*\.[a-zA-Z0-9]+$ /404/ [L]

# rule 2
RewriteRule ^(([^/\.]+)/?)*?$ /index.php [L]
这是:

# .htaccess 2
RewriteEngine on

# cond 1
RewriteCond %{REQUEST_FILENAME} !-f
# rule 1
RewriteRule [^\.]*\.[a-zA-Z0-9]+$ /404/ [L]

# cond 2
RewriteCond %{REQUEST_FILENAME} !index\.php$
# cond 3
RewriteCond %{REQUEST_URI} \.php$
# rule 2
RewriteRule [^\.]*\.[a-zA-Z0-9]+$ /404/ [L]

# rule 3
RewriteRule ^(([^/\.]+)/?)*?$ /index.php [L]
然而,只有第二个街区符合我的要求。例如,第一个.htaccess无法重定向不存在的文件a.pdf,而是显示关于找不到文件的默认服务器消息


谁能给我解释一下吗?

首先是你的或有条件的。htaccess的顺序不对

[或]
标志围绕这两条语句创建一个组,有效地将条件语句编写为:

if (
    (FILE_NOT_FOUND or FILE_NAME === 'index.php')
    and REQUEST_URI ends in .php
) { ... }
按照这种顺序编写,条件将永远不会匹配以PHP以外的扩展名结尾的URI

你真正想要的是:

if (
    (FILE_NOT_FOUND or REQUEST_URI ends in .php)
    and FILE_NAME !== 'index.php'
) { ... }
这可以通过简单地重新排列两个相关的重写条件来表示:

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{REQUEST_URI} !index\.php
RewriteRule [^\.]*\.[a-zA-Z0-9]+$ /404/ [L]
你甚至可以通过阅读自己的单词来发现自己的错误(简化以显示你心目中的实际条件):

我想做的是将每个不存在的文件重定向到/404/


关于.htaccess文件中
[或]
的优先级,如果您想了解更多关于mod_rewrite如何在内部实际工作的信息。

对于任何不存在文件的URL,例如:
/a.pdf
,这就是问题所在-据我所知,这两个块应该做相同的事情。但是,第二个块中的行为是正确的。请创建包含“A”的index.php文件。使用first.htaccess。对于
/a.pdf
URL,您将获得默认的“未找到”服务器响应。使用second.htaccess。您将得到“A”,因为
/A.pdf
将解析为
/404/
,这将解析为
/index.php
。现在-为什么行为不一样?因为还有其他规则,我希望不存在的文件和每个php文件遵循已经建立的已知行为。为什么?我提供了复制问题的代码。我所要问的只是解释为什么这些行为不一样。非常感谢——我以前看过这个答案,但我猜一定是晚了,或者我累了,并且(或)的优先级没有在我的大脑中正确注册(从标准语言优先级的角度看,我对正在发生的事情感到茫然)。