2009-02-23 141 views
2

比方說,在ColdFusion站點,用戶導航到 http://www.example.com/sub1/如何在ColdFusion中查看客戶端URL?

服務器端的代碼通常用來告訴你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」var將包含該「index.cfm」。

問題是,如何找出用戶實際訪問過哪個URL?這個問題主要針對搜索引擎優化的目的 - 通常最好301重定向「/index.cfm」爲「/」,以確保只有一個內容的URL - 因爲這主要是爲了蜘蛛的好處,JavaScript isn在這種情況下是一個合適的解決方案。另外,假設一個人無法訪問isapi_rewrite或mod_rewrite-問題是如何在ColdFusion中實現這一點,具體來說。

回答

6

我想這是不可能的。

如果客戶端請求「GET /」,則在ColdFusion甚至被調用之前,它將被Web服務器翻譯爲「GET/{whatever-default-file-exists-fist}」。(這對於Web服務器來說必須知道首先要調用ColdFusion!)

從ColdFusion(或任何應用程序服務器)的角度來看,客戶端請求「GET /index.cfm」,這就是你在#CGI#看到。

正如您已經指出的那樣,可以通過使用URL重寫工具進行區分。既然你明確排除了這條路,我只能說你在這裏運氣不好。

3

不確定是否可以僅使用CF,但是您可以使用網絡服務器的URL重寫 - 如果您正在使用它們,當然是

對於Apache,它可以看起來這樣。比方說,我們使用以下的mod_rewrite規則:??

重寫規則^頁/([0-9] +)/ $ index.cfm頁面= $ 1 & NOINDEX =是[L]

現在,當我們試圖訪問URL http://website.com/page/10/ CGI顯示:

QUERY_STRING頁= 10 & NOINDEX = YES

看到想法?使用IIS時,可能會想到同樣的事情。

希望這會有所幫助。

2

我不認爲這是可能的CF.根據我的理解,Web服務器(Apache,IIS等)確定要顯示的默認頁面,並從CF請求它。因此,CF不知道實際的被叫頁面是什麼。

Sergii是正確的,你可以使用URL rewrting來做到這一點。如果您無法使用該功能,則可以使用在默認頁面列表中給定特定頁面優先的事實。

我們假設default.htm是默認頁面列表中的第一頁。寫一個通用的default.htm,自動轉發到index.cfm(或其他)。如果你可以調整默認列表,你可以讓CF做301重定向。如果沒有,您可以進行元刷新或JS重定向,或者在HTML文件中執行某些操作。

1

我認爲這是可能的。

使用GetHttpRequestData您將可以訪問所有HTTP標頭。

然後GET頭文件應該告訴你瀏覽器正在請求什麼文件。

嘗試

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

,看看究竟你有什麼可以使用。

注 - 我沒有Coldfusion來驗證這一點。

編輯:已經做了一些更多的研究,看起來GetHttpRequestData不包括GET標題。所以這個方法可能不會起作用。

但我確定有一種方法 - 嘗試轉儲CGI範圍並查看您擁有什麼。

+0

不,用純CF解決方案似乎不可能。 CGI範圍和getHttpRequestData()都不具有客戶端URL字符串。 – ale 2009-02-24 14:32:56

0

如果你能夠安裝的ISAPI_Rewrite(假設你在IIS) - http://www.helicontech.com/isapi_rewrite/

這將插入一個變量x重寫的URL到GetHttpRequestData()結果結構將不得不/或/指數.cfm取決於訪問哪個URL。

Martin