2013-02-03 54 views
2

當您點擊時,是否有一種方法可以在整個站點中保留url參數?我正在製作一個演示網站,在第一頁上設置一個url參數,以確定以下頁面顯示的內容。我會使用會話變量,但內部用戶可能會在彼此之間共享鏈接,然後會話將不存在。我嘗試了谷歌搜索,但所有返回的文章都與Cake框架相關。有沒有辦法實現這一點,而不使用框架?流動的持久性URL參數

例子:

  • 選擇頁面>用戶選擇使用案例和印刷機提交查看演示網站
  • 內頁>檢測基於用例的URL參數,並顯示數據。
  • 當用戶點擊演示站點時,參數會一直顯示相關數據。
  • 當用戶返回選擇頁面時,他們可以選擇一個新的用例並重覆上述操作。
+1

沒有魔法。您需要手動將其附加到您的代碼生成的所有鏈接的查詢字符串中。 – meagar

+0

使用會話值,但不顯式添加url參數。這不是一個好習慣,並且不是一個好的用戶體驗(保持乾淨的URL)。會話值是登錄的。 – Amelia

回答

1

你可以只需在選擇中添加一個url參數,並確保它始終在所有內部鏈接中找到。我假設你不想這樣做,因爲它有太多的變化。

一些備選思路:

IDEA 1:

保存會話內或一個cookie內的初始選擇。同時爲所有頁面添加一個可選的url參數,該參數也包含選擇內容。爲了避免更改所有內部鏈接,請檢查服務器端是否給出了選擇url參數。如果不是,則只需添加url參數(根據會話/ cookie),立即重定向到相同的url。通過這種方式,url參數將始終顯示,無需改變所有內部鏈接,用戶仍然可以共享鏈接。

爲了實現起見,我們假設我們的會話變量爲$_SESSION['sel'],我們的可選URL參數爲psel。假設網站中的所有頁面都通過php提供。 PHP的下面幾行應該出現在所有頁面的頂部(可以放置在一個單獨的PHP文件,幷包含在每一頁):

if (!isset($_REQUEST['psel'])) 
{ 
    header('Location: '.$_SERVER['REQUEST_URI'].'&psel='.$_SESSION['sel']); 
    exit; 
} 

這是僞代碼,我在我的iPad這麼原諒我如果它有點短而不完美。該行所做的是檢查URL參數是否已定義,如果沒有,則重定向(到同一頁面)並根據我們的會話變量進行定義。這種方式即使我們有一個不包含URL參數的內部鏈接,這個重定向也會添加它。請求中有一個關於?的小錯誤,我會讓你修復它。

這段代碼並沒有改變所有的內部鏈接,它只做了以下幾點:當一個內部鏈接被訪問並且URL參數被省略(如通常那樣),這段代碼將停止頁面不顯示參數並重定向到與param相同的頁面。

另一個重要的代碼是在定義URL參數的情況下更改我們的會話變量。這可以通過添加這個else塊到上面的代碼來完成:

else $_SESSION['sel'] = $_REQUEST['psel']; 

這樣,當URL是由2個用戶共享,這將始終包含psel URL PARAM當新用戶第一次訪問它,它會相應地設置他的會話變量。

IDEA 2:

創建的每個選擇一個 「假」 的目錄。例如,假設您的網站爲http://example.com/index.php,那麼您將擁有http://example.com/sel1/index.phphttp://example.com/sel2/index.php。這些目錄不是真實的,使用.htaccess重寫(甚至FS中的符號鏈接)實際上會指向原始文件。除此之外,現在你在路徑中有這個神奇的參數。這很有用,因爲路徑將通過所有相關鏈接保持不變,這意味着您不必更改所有內部鏈接。如果您需要訪問當前選擇,您可以通過解析當前網址的路徑輕鬆獲取。

這個想法我覺得好一點,因爲它實現了同樣的事情,沒有重定向。使用符號鏈接解釋最簡單,但請記住,這也可以使用.htaccess重寫規則來完成。 Linux中的符號鏈接是鏈接到另一條路徑的路徑。如果我運行(通常使用我的服務器上SSH)以下控制檯命令:

ln -s . sel1 
ln -s . sel2 

它將裏面創建2個目錄。 (本地目錄),命名爲sel1和sel2,但它們只是指向原始當前目錄的鏈接。如果當前目錄是我的web服務器的根目錄,效果是訪問:

http://example.com/sel1/index.php 

實際上將獲得:

http://example.com/index.php 

請注意,這不是目錄的副本。如果我對index.php或本地目錄中的任何其他文件進行了更改,這些更改也將反映在/sel1/sel2

這有什麼用?如果我想顯示選擇2,我將使用網址http://example.com/sel2/index.php,而不是訪問我的常規網站。由於符號鏈接,此網址的行爲與我的原始網站http://example.com/index.php完全相同。

現在讓我們假設我想檢查php如果我顯示選擇2或不,我可以簡單地檢查變量$_SERVER['REQUEST_URI'],看看它是否包括路徑/sel2或不。

此路徑在所有內部URL之間將保持不變,因爲它們通常是相對的。

+0

htaccess重寫有點凌駕於我的頭上,但試圖理解選項1.你能詳細闡述一下嗎?我只想澄清一點 - 如果用戶訪問了一個頁面並且它有一個url_param,那麼我需要以某種方式將該參數附加到頁面上的所有網址,而無需調整其代碼。 (這些網頁上有大量的鏈接) – Syon

+0

我在這兩種解決方案上都闡述了一點。這兩種解決方案都避免了更改大量內部URL的要求。我其實更喜歡第二個。 – talkol

+0

謝謝!聽起來像一個堅實的想法 - 我要去與Idea2。 – Syon

0

我覺得你最好的解決辦法是將存儲他們的初始選擇一個$_SESSION變量裏面,然後簡單地認爲變量追加到整個網站的結構的URL,例如:

$url = (isset($_SESSION['use_case'])) ? $_SESSION['use_case'] : 'default'; 
echo 'my-page.php?use_case='.urlencode($url); 
+0

不幸的是,在這個演示網站上有大量的網址。我需要一些可以自動附加該參數的東西。我現在想也許只是通過js做到這一點?抓住所有錨點追加參數.. – Syon

+0

如果可能,我會避免JS。永遠不要依賴客戶端腳本,因爲它可以被用戶禁用,然後您的網站的功能不能得到保證。 – BenM

1

你描述什麼是cookies,但它們不會出現在URL。

對於你的用例,最好的解決方案是URL和相關鏈接中的路徑前綴,正如talkol在他的第二個想法中所描述的那樣。只要你保持鏈接相對,它不需要在服務器端做任何額外的工作。

你必須使用輸出緩衝URL重寫(見output_add_rewrite_var),解析來自applicatin生產的產出和更換鏈接第二個選項。但這是一個有點愚蠢的做法。當您有大量應用程序並且不想修改它時,這將是合理的。

所有其他方面都有關使用特殊功能或在框架生成PHP鏈接。