Php Apache重写规则导致“错误”;“重定向太多”;用于JS和CSS文件

Php Apache重写规则导致“错误”;“重定向太多”;用于JS和CSS文件,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我正在一个定制CMS(由其他人编写)的项目上工作。现有的.htaccess文件包含一些条件和重写规则,其中一个将请求定向到index.php文件。该文件加载CMS对象,并调用一个方法来检查URL是否指向现有的CMS页面。如果没有,用户将被重定向到404页面 CMS还允许您在基本CMS功能的基础上构建自定义模块。通常这是用于用户管理之类的,但是对于这个项目,客户希望能够建立一个包含数百个知识库项的知识库,这在CMS中会变得一团糟。我现在为这些项目构建了一个自定义模块,它们还存储一个slug。我希望

我正在一个定制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\u TOO\u多个重定向
错误

我已经将规则修改为
RewriteRule^kennisbank/items/(.*)$index.php?knowledge\u item\u slug=$1[C]
(基本上只是添加了
[C]
标志),现在项目详细信息页面工作了,但是任何其他页面都会导致错误
在该服务器上找不到请求的URL/domain.tld/page。

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


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

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

您可以通过以下方式访问.htaccess:

# 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]
什么都不做规则
重写规则^-[L]
将跳过该行以下针对上述条件的任何规则,即非文件和非目录