【问题标题】:Removing file extensions using .htaccess causes errors使用 .htaccess 删除文件扩展名会导致错误
【发布时间】: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,尽管您可以选择使用外部重定向删除尾部斜杠?

标签: apache .htaccess lamp bitnami


【解决方案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 你是怎么做到的?
  • 抱歉回复晚了!效果很好。
猜你喜欢
  • 2019-02-05
  • 2016-12-28
  • 2017-06-07
  • 2012-05-14
  • 1970-01-01
  • 2012-06-17
  • 2019-01-03
  • 1970-01-01
相关资源
最近更新 更多