如果你去這裏:http://twitter.com/account/resend_password如何在不影響瀏覽器歷史的情況下實現導航?
然後點擊「發送說明」沒有填寫表格,它似乎是做一個完整的,非ajax請求。
但是,如果我查看瀏覽器歷史記錄,則上一頁(resend_password)不在歷史記錄中。就好像它提出了一個Ajax請求。
Twitter在做什麼?這真的只是一個Ajax請求,還是它做一些棘手的事情?
如果你去這裏:http://twitter.com/account/resend_password如何在不影響瀏覽器歷史的情況下實現導航?
然後點擊「發送說明」沒有填寫表格,它似乎是做一個完整的,非ajax請求。
但是,如果我查看瀏覽器歷史記錄,則上一頁(resend_password)不在歷史記錄中。就好像它提出了一個Ajax請求。
Twitter在做什麼?這真的只是一個Ajax請求,還是它做一些棘手的事情?
這不是ajax請求。
這也不是什麼棘手的事情。
Twitter僅回答HTTP響應代碼爲302(臨時移動)的HTTP POST請求 - 請參閱http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection。瀏覽器的答案就像是HTTP響應代碼303(請參閱其他)。
事實上,發生的事情僅僅是重定向到同一頁面。
編輯:用於測試目的添加的代碼。
我剛纔用下面的代碼進行測試,並證實了上面所說的:
<form method="post"><input type="submit" value="click here" /></form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
header('Location: /test.php', true, 302);
?>
我使用PHP作爲服務器端編程語言。我將這個腳本保存爲web服務器公共根文件夾中的test.php
。它的行爲與Twitter頁面完全相同:單擊表單提交按鈕,使用header
函數觸發302重定向。瀏覽器歷史記錄不會更改。
window.location.replace
將加載一個頁面,但不會將其保存在歷史記錄中。
window.location.replace('http://twitter.com/account/resend_password');
我認爲這是更多的東西。當我將重定向複製到同一頁面時,瀏覽器歷史記錄會發展。 – Brian
@Brian:當我第一次發佈我的答案時,我沒有進行任何測試。現在,我已經測試過了,它工作。您確定您在重定向中將HTTP響應代碼302從服務器端發送到瀏覽器嗎? –
您應該針對「表單處理後重定向」或類似的內容(http://www.google.com/search?q=redirection+after+form+processing)進行Google調查。該技術背後的意圖是避免再次提交相同的數據......請參閱http://www.thefutureoftheweb.com/blog/get-redirect-after-post或http://raventools.com/博客/重定向後的表單處理/ ...還有很多其他的。 –