在我的 Web 服务器上,我在位于文档根目录的 .htaccess 文件中添加了一些重写规则(在我的例子中为/var/www/main/public_html/.htaccess
)。这些重写规则的目的是消除 URL 中对 .php 和 .html 文件扩展名的需要。
问题是:它对于大多数URL 都适用。但是,当尝试访问实际上是文件的子目录时,重写规则会不断将 .php 添加到末尾,直到服务器放弃并抛出错误500
。
为了更好地解释这个问题......可以说我的文件结构如下所示:
/index.php
/file.php
/folder/index.php
/folder/file.php
这些 URL 正确显示页面:
example.com
example.com/index
example.com/file
example.com/folder
example.com/folder/index
example.com/folder/file
然而,这种奇怪的循环发生在这样的 URL 上:
example.com/index/file
example.com/file/index
在 的情况下/index/file
,日志显示:
[core:debug] [pid 253721] core.c(3849): [client #####] AH00121: r->uri = /index/file.php.php.php.php.php.php.php.php.php.php
预期结果是这样的 URLexample.com/index/file
会导致404
错误
其他一切都按预期显示 404:
example.com/badfile
example.com/folder/badfile
example.com/badfolder/file
我对重写规则不是很有经验,并且真的不知道我在做什么:D 我几乎可以肯定我在某个地方犯了一个愚蠢的错误。任何帮助,将不胜感激!
该服务器是自托管的,在 Ubuntu 20.04 和 Apache2 上运行。
这是我的 .htaccess 文件包含的内容:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# External Redirect
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.html [NC]
RewriteRule ^ %1 [R=302,L,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L,NE]
# Internal Redirect
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
# Error Documents
ErrorDocument 403 /errors/403.php
ErrorDocument 404 /errors/404.php
ErrorDocument 500 /errors/500.php