我有一个位于根文件夹中的网站。它包含.htaccess
以下代码:
RewriteEngine on
RewriteRule ^(.*)/$ $1.php
当我打开时,http://example.com/login/
出现“404 未找到”错误,但是当我打开http://example.com/login
没有尾随的/
URL 时,打开没有任何问题。
我需要.htaccess
在根目录中设置代码来打开 PHP 文件,就像login.php
或/login/
(/login
不带尾随/
)。
答案1
尝试一下^([^/]+)/?$
,看看它是否按预期工作。
答案2
此行为是与 冲突的典型表现MuiltiViews
。您应该在文件顶部禁用 MultiViews .htaccess
:
Options -MultiViews
这就解释了为什么/login
没有尾随/
就可以成功提供文件 -RewriteRule
在这种情况下你的文件被完全绕过了。
启用 MultiViews 后,在请求 时/login/
,mod_negotiation 会模拟重写映射,并在/login.php
mod_rewrite 开始处理 URL 之前发出内部子请求。路径信息(尾随/
)被添加回来,成为/login.php/
。这将被传回进行进一步处理,并与您的过于通用的(^(.*)/$
)相匹配RewriteRule
图案,导致内部重写/login.php.php/
等。根据您的配置,这可能会导致 403(因为它可能导致格式错误的请求)或 404(正如您所看到的)。
禁用 MultiViews(如上所述)可以解决这个问题。但是,你还应该考虑让你的RewriteRule
图案更具限制性。例如,为了避免匹配已经包含点(即具有文件扩展名)的 URL:
RewriteRule ^([^.]+)/$ $1.php [L]
只需使正则表达式更加严格,甚至可能“修复”错误。但是,MultiViews 会发出内部子请求,而不是 mod_rewrite(您的规则将被绕过)。
作为
/login/
或/login
(带或不带尾随/
)
为了允许规则使用/login/
或/login
(即带或不带尾部斜杠)您需要使尾部斜杠成为可选的,即。/?
但您还需要使前面的模式非贪婪或在否定字符类中包含斜杠,以避免在反向引用中捕获尾部斜杠。
例如,以下任一:
RewriteRule ^([^.]+?)/?$ $1.php [L]
或者,
RewriteRule ^([^./]+)/?$ $1.php [L]
但是第二条规则仅适用于包含单个路径段的 URL,而第一条规则适用于形式为 的 URL /foo/bar/login
。
总之
Options -MultiViews
RewriteEngine On
RewriteRule ^([^.]+?)/?$ $1.php [L]