2011-05-25 85 views
2

是否可以在不執行重定向的情況下更改響應URL?在不重定向的情況下更改響應URL

稍長的故事......

由於與HTML窗體的限制下,因爲從操作URL查詢字符串沒有提交到服務器不工作:

<?php // handler.php ?> 
... 
<form action="handler.php?lost=value" method="get"> 
    <input type="text" name="filter-keyword" value="" /> 
    <input type="submit" name="do-submit" value="Submit" /> 
</form> 
... 

所以我決定切換到使用post方法並創建一個單獨的過濾器處理程序腳本,該腳本僅爲「handler.php」文件構造正確的查詢字符串。

<?php // handler.php ?> 
... 
<form action="filter-handler.php" method="post"> 
    <input type="hidden" name="preserve-qs" value="lost=value" /> 
    <input type="text" name="filter-keyword" value="" /> 
    <input type="submit" name="do-submit" value="Submit" /> 
</form> 
... 

// filter-handler.php 
<?php 
    $new_url = 'handler.php?filter-keyword=' . $_POST['filter-keyword']; 
    if (isset($_POST['preserve-qs']) && $_POST['preserve-qs'] != '') 
     $new_url .= '&' . $_POST['preserve-qs']; 

    header("Location: $new_url"); 
?> 

是否有可能實現這一點而不執行重定向?

// filter-handler.php 
<?php 
    $qs_args = array(
     'filter-keyword' => $_POST['filter-keyword']; 
    ); 
    if (isset($_POST['preserve-qs']) && $_POST['preserve-qs'] != '') 
     parse_str($_POST['preserve-qs'], $qs_args); 

    // Fake query string. 
    $_GET = $qs_args; 

    // handler script is blissfully unaware of the above hack. 
    include('handler.php'); 


    // ???? HOW TO UPDATE QUERY STRING IN BROWSER ADDRESS BAR ???? 

    // Following no good because it redirects... 
    //header("Location: $new_url"); 

?> 
+5

如果你只是在'get'表單類型中將'lost'屬性作爲''屬性放入,那會將該參數在URL上。 – Orbling 2011-05-25 23:42:47

+0

請不要在標題中寫標籤。 – 2011-05-25 23:50:57

+0

不幸的是,提交表單時會清除所有GET類型的參數。 – drudge 2011-05-25 23:59:23

回答

5

是和否。

不,因爲實際上確實從服務器端更改URL,您必須重定向。

是的,因爲還有其他解決方案來解決您的問題。

解決方案沒有。 1:

從第一個例子改變你的代碼:

<?php // handler.php ?> 
... 
<form action="handler.php" method="get"> 
    <input type="hidden" name="lost" value="value" /> 
    <input type="text" name="filter-keyword" value="" /> 
    <input type="submit" name="do-submit" value="Submit" /> 
</form> 
... 

,這應該引起適當的URL(與lost=value)。

解決方案沒有。 2(醜陋之一):

在腳本的開頭覆蓋$_GET數組,以欺騙應用程序使其相信GET參數已通過。

解決方案沒有。 3(關於更改URL而不重定向):

此解決方案可能不適合您,但它實際上模仿更改的URL。它不在服務器端,但它實際上更改了用戶的URL。這被稱爲pushState(演示here),這是HTML5/JavaScript功能。

如果您可以使用JavaScript併發出AJAX請求,該解決方案對您來說可能非常適合(例如,您可以調用您喜歡的任何URL並動態傳遞所需的數據,甚至更改您要提交的表單字段的值) 。

+0

解決方案沒有。 2基本上是我在我的問題中提出的,但第二個想法是否更新用戶代理URL並不重要,因爲就PHP而言,這是正確的。解決方案編號3沒有解決我的問題,但它肯定是一個有趣的!這很可能在未來派上用場!我會玩一玩,看看它的效果如何。 – 2011-05-26 00:27:32

+0

@Lea感謝您的反饋。廣告。解決方案編號2 - 是的,正確的,我剛剛發現了。你應該避免的原因是,將來它將很難調試它。廣告。解決方案編號3 - 您應該知道,在大多數不推薦的瀏覽器(IE)中,它不起作用,您可以通過更改'window.location.hash'實現類似的目標([更多信息](https://developer.mozilla.org/en /DOM/window.location))。無論如何,解決方案沒有。 1幫助你? – Tadeck 2011-05-26 00:32:46

+0

@Tadeck我完全同意你在說什麼。在這種情況下,我可能很需要使用重定向解決方案。我也注意到解決方案2提示用戶刷新時重新提交表單,而自動重定向避免了這個問題。當使用header('Location:xxx')發生重定向時,它會強制Web瀏覽器提交一個新的請求,還是Web服務器會自動執行? – 2011-05-26 00:36:07

相關問題