2

假设在 ColdFusion 站点上,用户导航到 http://www.example.com/sub1/

服务器端代码通常用于告诉您用户所在的 URL,如下所示: http://#cgi.server_name##cgi.script_name#?#cgi.query_string#

但是,“cgi.script_name”会自动包含该文件夹的默认 cfm 文件——例如,该代码在解析和扩展时将显示“ http://www.example.com/sub1/index.cfm

因此,无论用户访问的是 sub1/index.cfm 还是 sub1/,“cgi.script_name”变量都将包含该“index.cfm”。

问题是,如何确定用户实际访问的是哪个 URL?这个问题主要是出于搜索引擎优化的目的——通常最好将 301 重定向“/index.cfm”到“/”以确保任何内容只有一个 URL——因为这主要是为了蜘蛛的利益,所以 JavaScript 不是在这种情况下不是合适的解决方案。此外,假设一个人无权访问 isapi_rewrite 或 mod_rewrite - 问题是如何在 ColdFusion 中实现这一点,特别是。

4

5 回答 5

6

我想这是不可能的。

如果客户端请求“GET /”,Web 服务器将在调用 ColdFusion 之前将其转换为“GET /{whatever-default-file-exists-fist}”。(这对于让 Web 服务器知道必须首先调用 ColdFusion 是必要的!)

从 ColdFusion(或任何应用程序服务器)的角度来看,客户端请求“GET /index.cfm”,这就是您在#CGI#.

正如您自己指出的那样,可以通过使用 URL 重写工具来区分。由于您专门排除了该路径,因此我只能说您在这里不走运。

于 2009-02-23T22:29:00.990 回答
3

不确定是否可以仅使用 CF,但您可以使用网络服务器的 URL 重写来实现这一点——当然,如果您正在使用它们

对于 Apache,它可以是这样的。说,我们正在使用以下 mod_rewrite 规则:

RewriteRule ^page/([0-9]+)/?$ index.cfm?page=$1&noindex=yes [L]

现在,当我们尝试访问 URL http://website.com/page/10/时, CGI 显示:

QUERY_STRING page=10&noindex=yes

看到这个想法了吗?认为在使用 IIS 时也有同样的可能。

希望这可以帮助。

于 2009-02-23T21:35:45.907 回答
2

我认为这在 CF 中是不可能的。据我了解,网络服务器(Apache、IIS 等)确定要显示的默认页面,并从 CF 请求它。因此,CF 并不知道实际调用的页面是什么。

Sergii 是对的,您可以使用 URL 重写来执行此操作。如果这对您不可用,您可以使用特定页面在默认页面列表中优先的事实。

假设 default.htm 是默认页面列表中的第一页。编写一个自动转发到 index.cfm(或其他)的通用 default.htm。如果您可以调整默认列表,您可以让 CF 执行 301 重定向。如果没有,您可以在 HTML 文件中执行元刷新、JS 重定向或类似的操作。

于 2009-02-23T22:28:03.397 回答
1

我认为这是可能的。

使用GetHttpRequestData您将可以访问所有 HTTP 标头。

然后其中的GET标题应该告诉您浏览器正在请求什么文件。

尝试

<cfdump var="#GetHttpRequestData()#"> 

准确查看您可以使用的内容。

注意 - 我没有 Coldfusion 可以验证这一点。

编辑:做了一些更多的研究后,似乎GetHttpRequestData不包括GET标题。所以这种方法可能行不通。

不过,我相信有一种方法 - 尝试转储 CGI 范围,看看你有什么。

于 2009-02-23T23:17:48.440 回答
1

如果您能够安装 ISAPI_rewrite(假设您在 IIS 上) - http://www.helicontech.com/isapi_rewrite/

它将变量 x-rewrite-url 插入到 GetHttpRequestData() 结果结构中,该结构将具有 / 或 /index.cfm ,具体取决于访问的 URL。

马丁

于 2009-08-03T16:00:33.377 回答