使用URL重写文件时多次包含?

时间:2012-06-17 16:19:27

标签: coldfusion url-rewriting coldfusion-10

我正在ColdFusion 10中开发一个新站点,并使用.htaccess文件进行一些URL重写。当我在没有其他包含的情况下调用它们时,我有三个规则可以正常工作。当我将它们包含在包含中时,我收到错误。

以下是我的规则:

RewriteEngine on
RewriteRule ^advertise$ /index.cfm?Section=Advertise
RewriteRule ^bike/([0-9]+)/([0-9]+)/ /index.cfm?Section=Bike&BikeID=$1&FeatureID=$2
RewriteRule ^bike/([0-9]+)/ /index.cfm?Section=Bike&BikeID=$1

索引页面显示我们要显示的部分和调用包括围绕页眉和页脚的相应文件,如下所示:

include "header.cfm"; 
include "#VARIABLES.Section#.cfm";
include "footer.cfm";

问题是,它对于“自行车”页面来说并不是很有效,后两个规则。似乎头文件被包含多次,这使得CSS和其他文件的链接变坏,这会弄乱页面。如果我注释掉页眉和页脚包含,一切正常,但没有页眉或页脚,这不是我想要的。

// include "header.cfm"; 
include "#VARIABLES.Section#.cfm";
// include "footer.cfm";

url重写规则中是否有某些内容导致自行车页面被多次加载然后失败?

http://flyingpiston2012-com.securec37.ezhostingserver.com/

您可以在此处尝试此页面,然后点击链接查看问题。关于如何解决这个问题的任何想法?

更新

当我通过包含整个网址将所有链接设为绝对时,问题就会消失。

<cfoutput>
<link href="#APP.Home#/bootstrap/css/bootstrap.css" rel="stylesheet">
</cfoutput>

但是,我不应该包含文件的绝对路径。关于为什么这对我不起作用的任何暗示?

更新

// THIS FIXES THE PROBLEM
<base href="#APP.Home#/">
<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">

// THIS FIXES THE PROBLEM
<link href="#APP.Home#/bootstrap/css/bootstrap.css" rel="stylesheet">

// THIS IS THE PROBLEM
<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">

3 个答案:

答案 0 :(得分:3)

无论您遇到什么问题,尝试在.htaccess重写规则和CF包含的文件之间建立连接都是错误的故障排除方法。

重写规则仅适用于传入请求:浏览器地址栏(例如)中请求的文档。

当一个人包含一个文件时,它没有发出请求,因此不涉及网络服务器(以及相应的重写模块)。

我想如果您只是浏览到自行车页面的重写URL(例如:/index.cfm?Section-Bije&BikeID=12345),您会看到同样的问题。这表明重写不是问题的一部分。

将此概念从您的调查中解脱出来,只看看您的文件是如何被包含的。一个好的简单起点就是打开调试,然后使用TREE视图查看执行时间dispay。这将让您了解多次在模板中调用的位置/方式/原因。

答案 1 :(得分:2)

这可能发生,因为您没有告诉Apache停止在匹配上解析。尝试使规则看起来像这样:

RewriteRule ^advertise$ /index.cfm?Section=Advertise [L]
RewriteRule ^bike/([0-9]+)/([0-9]+)/ /index.cfm?Section=Bike&BikeID=$1&FeatureID=$2 [L]
RewriteRule ^bike/([0-9]+)/ /index.cfm?Section=Bike&BikeID=$1 [L]

答案 2 :(得分:1)

我不知道它是否相关,但我确实遇到了与FW / 1类似的问题。通过尾随rewrite.log我可以看到实际上不存在的每个cfinclude实际上是通过Apache。我将[NS]添加到了.htaccess,它就消失了:

# rewrite rules, NS skips rewrite rule for internal sub-requests
# for FW/1, removes index.cfm from the URL
RewriteRule ^(.*)$ /index.cfm/$1 [NS,L]