htaccess RewriteRule 导致 404 响应

htaccess RewriteRule 导致 404 响应

我有一个位于根文件夹中的网站。它包含.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.phpmod_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]

相关内容