Apache 重写规则导致 JS 和 CSS 文件"too many redirects"



我正在开发一个带有自定义CMS(由其他人编写(的项目。现有的.htaccess文件具有一些条件和重写规则,其中一个规则将请求定向到index.php文件。该文件加载CMS对象,并调用一个方法来检查URL是否指向现有的CMS页面。如果没有,用户将被重定向到404页面。

CMS还允许您在基本CMS功能的基础上构建自定义模块。通常这是用于用户管理之类的东西,但对于这个项目,客户希望能够建立一个包含数百个知识库项目的知识库,这在CMS中会变得一团糟。我现在已经为这些项目构建了一个自定义模块,它们还存储了一个slug。我希望URL是/knowledgebase/items/item-slug,但根据现有配置,这将导致重定向到404页面,因为据CMS所知,item-slug不会导致现有CMS页面。这是.htaccess文件中的当前重写部分。

# Enable the rewrite engine
RewriteEngine On
RewriteBase /domain.tld
# SSL Redirect 301 transfer the current request.
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# never rewrite for existing files, and links
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
#RewriteCond %{REQUEST_FILENAME} !-d
# For Friendly URLs
RewriteRule ^knowledgebase/items/(.*)$ index.php?knowledge_item_slug=$1 # my own RewriteRule
RewriteRule ^(.*)$ index.php [L]

在index.php中,我添加了以下行来检查是否需要显示自定义知识库项

if (isset($_GET['knowledge_item_slug']) && $_GET['knowledge_item_slug'] !== '') {
include_once(__DIR__ . '/components/knowledgebase_item.php');
exit(0);
}

这样做很好,转到knowledgebase/items/test可以加载测试项。然而,添加了此规则后,在硬重新加载(清除缓存(后将无法再找到CSS和JS文件,并导致控制台中出现net::ERR_TOO_MANY_REDIRECTS错误。

我已经将规则修改为RewriteRule ^kennisbank/items/(.*)$ index.php?knowledge_item_slug=$1 [C](基本上只是添加了[C]标志(,现在项目详细信息页面可以工作,但任何其他页面都会导致错误The requested URL /domain.tld/page was not found on this server.

我还尝试过将RewriteRule ^(.*)$ index.php放在我自己的RewriteRule之上(显然没有[L]标志(,但我自己的一个根本不起作用。

我不太熟悉Apache重写,知道是什么导致了这个问题吗?

问题是在检查RewriteCond中的非文件和非目录后,您有两个RewriteRule规则。只有紧挨着的下一个RewriteRule受到一个或多个RewriteCond的影响,因此最后一个规则执行,而没有任何将包括css/js/images在内的每个请求路由到index.php的条件。

你可以这样访问.hta:

# Enable the rewrite engine
RewriteEngine On
RewriteBase /domain.tld
# SSL Redirect 301 transfer the current request.
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
# never rewrite for existing files, and links
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
# For Friendly URLs
RewriteRule ^knowledgebase/items/(.*)$ index.php?knowledge_item_slug=$1 [L,NC,QSA]
RewriteRule ^ index.php [L]

不执行任何操作对于上述条件,即非文件和非目录,规则RewriteRule ^ - [L]将跳过该行以下的任何规则。

相关内容