使用 .htaccess 删除文件扩展名会导致错误

Posted

技术标签:

【中文标题】使用 .htaccess 删除文件扩展名会导致错误【英文标题】:Removing file extensions using .htaccess causes errors 【发布时间】:2021-11-07 16:43:48 【问题描述】:

今天早些时候,当人们使用 .htaccess 访问我的网站时,我试图删除 php 文件扩展名。 (有点像https://tecadmin.net/remove-file-extension-from-url-using-htaccess/) 以下是我的.htaccess 文件:

#Remove php file extensions
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

RewriteEngine on 
RewriteCond %THE_REQUEST /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^ %REQUEST_URI.php [NC,L]

代码似乎在发挥作用,但我很快发现了一个问题。 http://example.com/pagehttp://example.com/page.php 工作得很好,但是当我访问 http://example.com/page/ 时,服务器返回一个内部服务器错误。 (500)

我尝试在网上查找如何解决此问题,但结果一无所获。有谁知道如何解决这个问题?

【问题讨论】:

Bitnami 工程师在这里。如果您收到 500 错误代码,您可以从 Apache 的日志 (/opt/bitnami/apache2/logs/error_log) 中获得更多信息,您可以编辑您的消息并包含该信息吗? 在请求/page/(带有斜杠)时,您希望看到什么响应?正确的响应可以说是 404,尽管您可以选择使用外部重定向删除尾部斜杠? 【参考方案1】:
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

RewriteEngine on 
RewriteCond %THE_REQUEST /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^ %REQUEST_URI.php [NC,L]

您的第一条和最后一条规则是在做同样的事情(通过内部重写附加 .php 扩展名),但是,它们的做法略有不同,并且可以说是错误的。而且你当然不需要两者。

请求/page/ 时的 500 错误是由重写循环引起的。第一条规则将请求重写为/page/.phplast 规则然后将请求第二次重写为/page/.php.php,然后再次重写为/page/.php.php.php 等等。因为REQUEST_FILENAME 在所有情况下都是/page,所以%REQUEST_FILENAME.php(在条件)不一定与%REQUEST_URI.php(被重写的URL)相同。

请尝试以下方法:

Options -MultiViews

RewriteEngine On

# Remove php file extensions

RewriteCond %THE_REQUEST \s/([^.]+)\.php [NC]
RewriteRule ^ /%1 [R=301,L]

RewriteCond %DOCUMENT_ROOT/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]

删除 .php 扩展的重定向应该是 301(永久)重定向,一旦您确认它按预期工作。

RewriteRule 指令上的 NC 标志是多余的。

在正则表达式字符类中使用时,无需反斜杠转义文字点。这些点在这里没有特殊含义。所以,[^.][^\.] 相同。 (虽然你逃脱了一个而不是另一个。)

现在这会检查%DOCUMENT_ROOT/$1.php 是否与RewriteRule substitution 字符串中被重写的相同文件,即。 $1.php.

注意:我已明确禁用 MultiViews 以确保这些指令不会被 mod_negotiation 覆盖。

如果请求/page/(带有尾部斜杠),现在将导致 404。如果这应该返回与/page 相同的结果,那么这应该作为额外的重定向来实现,以删除尾部斜杠。

【讨论】:

谢谢!我会检查一下。 @Leo 你是怎么做到的? 抱歉回复晚了!效果很好。

以上是关于使用 .htaccess 删除文件扩展名会导致错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 .htaccess 文件删除 .php 扩展名时出现 403 禁止错误

.htaccess 文件 - 删除 .php 扩展名“服务器错误”[重复]

.htaccess(500 内部服务器错误) - 删除 url 中的文件扩展名

使用 .htaccess 删除 .php 扩展名会重复我的页面吗?

使用 .htaccess 文件后,从我网站上的一个页面重定向到另一个页面会导致 404 错误

使用 .htaccess 文件删除 .php 文件扩展名