使用 .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/page
和 http://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/.php
。 last 规则然后将请求第二次重写为/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 扩展名会重复我的页面吗?