如何解决Apache重写规则导致JS和CSS文件“重定向过多”
我正在使用自定义CMS(由其他人编写)进行项目。现有的.htaccess
文件带有一些条件和重写规则,其中之一将请求定向到index.PHP
文件。该文件加载CMS对象,并调用一种方法来检查URL是否指向现有的CMS页面。如果不是,则将用户重定向到404页面。
CMS还允许您在基本CMS功能的基础上构建自定义模块。通常,它用于用户管理之类的东西,但是对于该项目,客户希望能够建立包含数百个知识库项目的知识库,而这在CMS中将变成一团糟。我现在为这些项目构建了一个自定义模块,并且它们还存储了一个块。我希望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重写不太熟悉,知道导致此问题的原因是什么
解决方法
问题是在检查RewriteRule
中的非文件和非目录后,您有2条RewriteCond
规则。只有紧接的下一个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]
什么都不做规则RewriteRule ^ - [L]
将跳过该行下方的任何规则,以解决上述情况,即非文件和非目录。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。