.htaccess的操作出乎意料



我有一个非常简单的php项目,包含三个文件,分别命名为file.phpfilesuccess.php和filesfailure.php

根目录中有一个.htaccess文件,包含以下代码行:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^file-success file-success.php [NC,L]
RewriteRule ^file-failure file-failure.php [NC,L]
RewriteRule ^file file.php [NC,L]

令人惊讶的是,/file的成功为我提供了file.php的内容.

但是,如果我切换第4行和第5行,/file failure将显示file.php的内容.

这种行为的原因是什么?我缺少什么概念?

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^file-success file-success.php [NC,L]
RewriteRule ^file-failure file-failure.php [NC,L]
RewriteRule ^file file.php [NC,L]

当您请求/file-success时。。。

  1. 第一条规则将请求重写为file-success.php。重写引擎使用L标志重新启动
  2. 然后,第三规则将file-success.php重写为file.php。正则表达式^file匹配任何仅以file开头的URL路径

您需要在正则表达式中更加具体。即包括绳端锚。并且前面的条件(RewriteCond指令(对于这样一组有限的规则是不需要的(无论如何,这些条件只适用于第一个规则(。

请使用以下内容:

RewriteEngine On
RewriteRule ^file-success$ file-success.php [NC,L]
RewriteRule ^file-failure$ file-failure.php [NC,L]
RewriteRule ^file$ file.php [NC,L]

但是,这里应该避免使用NC标志,因为它可能会让您打开重复内容的大门。使用regex交替可以将这3条规则组合为一条规则,例如:

RewriteRule ^(file-success|file-failure|file)$ $1.php [L]

$1backreference包含请求的文件基名称,如RewriteRule模式所捕获的。

最新更新