2012-12-14 66 views
4

.htacesss如何在.htaccess重定向後通過ajax請求保留POST數據?

RewriteCond %{REQUEST_URI} ^/api/(.+)$ 
RewriteRule ^api/(.+)$ /index.php?api=%1 [QSA,L] 

例如AJAX網址: 'http://hostname.com/api/ext/list.php?query=de'

我希望能夠到重定向這種格式的URL以下 的index.php?API = {} requested_filename參數1 & =值1 &參數2 =值2 ...

因爲整個網站中的index.php通過引導程序處理whic h有路由部分加載配置,模板等...

當我嘗試一個jQuery代碼例如,重定向後POST數據丟失。

$.ajax({ 
      url: '/api/contact.php', 
      type: 'POST', 
      data: { 
       email: $("#contactEmail").val(), 
       name: $("#contactName").val(), 
       message: $("#contactMessage").val() 
           // etc ... 
      } 
}); 

我讀過你無法保存http重定向的數據。但是,所有的框架如何避免這種情況?我編了很多,每一個都通過index.php進行引導,在.htaccess文件中有重寫規則來啓用漂亮的URL。例如,在Yii中,我會用一些POST數據調用url「api/uploads/latests.json」,後端的控制器會接收這些數據。我在這裏錯過了什麼?

注意:我測試了[P] mod_rewrite參數,我認爲這個服務器沒有啓用mod_proxy。

+1

發佈數據通過簡單的URL重寫被保留。 –

+0

簡單的與複雜的簡單的不同? –

+1

你在做什麼是一個URL重寫 - 而不是重定向。您應該可以通過查看http請求/響應來驗證這一點,如TamperData –

回答

4

有一個重寫和重定向之間的差異。

重寫是一個apache(和其他服務器)模塊,它將遵循一組cond/rules將請求的url映射到服務器上的文件(例如:bootstrap將所有url重寫爲單個文件,通常是index.php .mvc可以將uri映射/模型/控制器/查看uri到調用適當的mvc文件的index.php)。

重定向實際上會改變您所在的頁面。有人請求頁面A.php,並且該頁面顯示「您正在尋找的是B.php」,因此您的瀏覽器會轉到B.php。

重寫將保留髮布參數,因爲url不會更改。重寫只會改變所請求的腳本,但對於瀏覽器來說,它看起來像仍然存在於請求的URL處。

重定向不會保留髮布參數,因爲服務器會將您重定向到另一個頁面。

看起來你試圖做的是重寫,而不是重定向。您應該沒有問題獲取發佈參數。

爲了解決這個問題,你如何檢查index.php中沒有post參數?你確定你期望的控制器會被叫嗎?

+3

感謝您的澄清。在理解了重定向和重寫之間的區別之後,我解決了我的問題。我檢查了整個htaccess並注意到有人在.htaccess文件的頂部爲每個請求強制執行301重定向規則 –

3

所有POST數據在重定向時都丟失。沒有辦法通過htaccess重寫/重定向規則來保存它。

客戶端(我知道的所有主流瀏覽器)接收到的重定向(全部爲301,302,303)被視爲一個新的url來發出GET請求。即使重定向的源是POST請求,瀏覽器也不會自動將舊的發佈參數粘貼到此URL。

我周圍發現的唯一方法是重寫代碼,並將POST參數轉換爲GET參數,並將它們粘貼到新url的末尾。在PHP中,然後發出一個頭部位置改變(或任何轉接呼叫您所選擇的庫使用):

header("Location: http://www.example.com/?my_old_post_args=123"); 
exit; 
1

對於任何一個有這個問題我有SAM的問題,我使用 一些這樣的事

RewriteRule ^services/MainService/(.*)$ http://193.9.162.91/mobile-feed/mobile.list.news.images.php?original_request=$1 [R=301,L] 

這不會與阿賈克斯後工作,我必須將重寫規則chnage到

RewriteRule ^services/MainService/(.*)$ http://193.9.162.91/mobile-feed/mobile.list.news.images.php?original_request=$1 [QSA,L] 

這項工作 和在php文件我有

$inputJSON = file_get_contents('php://input'); 
$input= json_decode($inputJSON, TRUE); //convert JSON into array 
print_r($input);