你可以只需在選擇中添加一個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.php和http://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之間將保持不變,因爲它們通常是相對的。
沒有魔法。您需要手動將其附加到您的代碼生成的所有鏈接的查詢字符串中。 – meagar
使用會話值,但不顯式添加url參數。這不是一個好習慣,並且不是一個好的用戶體驗(保持乾淨的URL)。會話值是登錄的。 – Amelia