Php Apache重写规则导致“错误”;“重定向太多”;用于JS和CSS文件
我正在一个定制CMS(由其他人编写)的项目上工作。现有的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。我希望
.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]
将跳过该行以下针对上述条件的任何规则,即非文件和非目录