2010-08-06 55 views
0

最近,當我看到谷歌結果頁面時,查詢和其他參數傳遞給#(散列)而不是通常的「?」如何在PHP中使用哈希傳遞參數

此外,在臉書我看到了同樣的事情。這是非常有趣的,經過與google的簡單搜索,我發現了與perl和Ruby相關的結果,但沒有使用PHP的結果。

是否有可能在PHP中使用#而不是「?」來傳遞參數或者只有perl/Ruby纔有可能。這將很有用,搜索引擎不會解析URL中的參數。

任何想法對我都有幫助。

回答

8

傳統上,#告訴瀏覽器自動滾動到頁面中的一個特定點,該點已經(並且仍然)經常用於實現來自頁面的一部分的鏈接(例如內容)到另一個(例如一節標題)。

但是,它也會導致包含#的URL被記錄在歷史記錄中,即使它與之前的URL相同,除了#以及之後的內容。 (換句話說,用戶仍然在同一頁面上)。這意味着即使狀態更改與頁面不一致,也可以使用後退按鈕返回到之前的狀態,加載。

因此,現代AJAX應用程序常常用它來表示用戶可能想要「返回」的事情發生。

+0

如果我正確理解這一點,它確實只是一個信號。使用後退按鈕實際上不會撤消對頁面的更改。 – 2010-08-06 16:48:42

+0

你在使用ajax獲取參數值(在谷歌樣式中)的任何教程? – 2010-08-06 16:50:32

+1

@Aakash Chakaravarthy:剛剛使用了維基百科文章(http://en.wikipedia.org/wiki/Fragment_identifier)和個人經歷。有許多方法可以獲得片段標識符的值(如果我沒有記錯的話,可以使用'window.location',但我沒有及時瞭解AJAX的最新實踐)。 – David 2010-08-07 02:12:41

1

不是,這是不可能的。
你看到的只是一種裝飾,以反映地址欄中的AJAX調用。

無論您選擇哪種語言 - 它們都位於服務器端,並使用HTTP協議與瀏覽器通信。 HTTP請求中不允許使用錨點。這是完全客戶端的東西

+0

不可能_without_clientside腳本將變量傳遞給服務器端。你可以很容易地設置一些東西,使JavaScript與哈希數據 – 2010-08-06 16:54:13

+0

@Jamie服務器,這是不可能與HTTP協議。期間 – 2010-08-06 17:03:13

+0

當您點擊某個頁面時,它不會通過HTTP協議發送,我同意這一點。但是,JavaScript可以提取數據,序列化,然後用AJAX調用或使用重定向作爲GET變量來訪問服務器端腳本。 – 2010-08-09 14:54:33

0

您在搜索結果中遇到混淆,因爲散列一詞是overloaded,正如參數傳遞的概念一樣。

您看到了在散列中傳遞值的概念引用,因爲associative array在某些語言中稱爲散列(這是散列表的簡寫)。

#字符也被混淆命名。它被稱爲「哈希」,「磅」,「數字」和「十八」。自從我在美國長大以來,我把它稱爲我的腦海中的一個「英鎊符號」,這可能會讓更多英國英語的用戶感到惱火,並且不會有混亂的可能性(考慮「£」)。

在函數中傳遞函數參數在Perl中是一個獲取命名參數的好方法。 PHP只有位置參數,但是使用Array可以很好地工作。

許多網絡庫對錶單值使用散列/關聯數組類型結構。鍵通常是字段ID,值是字段值。

在URI中,#表示片段說明符的開始。它標識了URI指向的頁面的一部分。它通常不用於將請求信息從客戶端傳回服務器。

-1

有可能是一些服務器重寫或左右。 實例與Apache服務器,你可以處理一些URI像

http://www.mysite.com#something

,並把它改寫爲

http://www.mysite.com/perl/script.pl?data=something

等處理它作爲一個簡單的GET查詢到您的script.pl

這是所有服務器端處理,對客戶端不可見

+0

它不能被服務器處理,因爲片段沒有被髮送到服務器。 – 2010-08-07 04:32:58

+0

沒有發送到服務器?好吧,也許我誤解了一些東西,但你如何提交請求谷歌沒有發送任何東西到服務器...... oO – benzebuth 2010-08-08 16:28:21

+0

@benzebuth:**這個片段**沒有被髮送到服務器,這意味着沒有頁面重新加載和URL不會更改(意思是URL更改會調用頁面重新加載)。谷歌和類似的應用程序正在使用AJAX並以這種方式向服務器發送數據。你的常識可能是試圖解釋在##後URL中的任何變化都不會導致頁面重新加載,所以這種方式(GET/POST)什麼都沒有發送到服務器。 – trejder 2012-10-25 19:52:57