微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache重写规则导致JS和CSS文件“重定向过多”

如何解决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 举报,一经查实,本站将立刻删除。