我正在开发一个带有自定义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]
将跳过该行以下的任何规则。