我有一个非常简单的php项目,包含三个文件,分别命名为file.php、filesuccess.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
时。。。
- 第一条规则将请求重写为
file-success.php
。重写引擎使用L
标志重新启动 - 然后,第三规则将
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]
$1
backreference包含请求的文件基名称,如RewriteRule
模式所捕获的。