【问题标题】:htaccess issue - strange [OR] behaviourhtaccess 问题 - 奇怪的 [OR] 行为
【发布时间】:2016-03-05 15:29:10
【问题描述】:

我注意到 htaccess 中的 [OR] 存在我不理解的问题。我想要做的是将每个不存在的文件和每个 .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,而是显示有关未找到文件的默认服务器消息。

谁能给我解释一下?

【问题讨论】:

  • 对于任何不存在文件的 URL,例如:/a.pdf
  • 这就是问题所在——据我了解,这两个块都应该做同样的事情。然而,第二个块中的行为是正确的
  • 请创建 index.php 文件,其中包含“A”。首先使用.htaccess。对于/a.pdf URL,您将获得默认的“未找到”服务器响应。使用第二个 .htaccess。你会得到“A”,因为/a.pdf 将解析为/404/,而/index.php 将解析为/index.php。现在 - 为什么行为不一样?
  • 因为还有其他规则,我希望不存在的文件和每个 php 文件都遵循已经建立的已知行为。
  • 为什么?我提供了复制问题的代码。我要问的只是解释为什么行为不一样。

标签: .htaccess


【解决方案1】:

您在第一个 .htaccess 中的 OR 条件顺序错误。

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

if (
    (FILE_NOT_FOUND or FILE_NAME === 'index.php')
    and REQUEST_URI ends in .php
) { ... }

按此顺序编写,条件永远不会匹配以 PHP 以外的 other 扩展名结尾的 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]

您甚至可以通过阅读自己的话来发现自己的错误(简化以显示您想到的实际条件):

我想要做的是重定向每个不存在的文件 [或] 每个.php文件,[and] 不是/index.php强>到/404/。

Here is a good StackOverflow question/answer 关于 .htaccess 文件中 [OR] 的优先级,如果您想了解更多关于 mod_rewrite 在内部实际工作的信息。

【讨论】:

  • 非常感谢 - 我以前看过那个答案,但我想肯定是太晚了,或者我很累并且 [OR] 的优先级没有正确记录在我的大脑中(从标准语言优先级的角度来看,我不知道发生了什么)。
猜你喜欢
  • 2012-10-19
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
相关资源
最近更新 更多