2013-10-02 51 views
3

我做一個簡單的jQuery後:POST返回403,如果URL是數據

$.post("script.php", { urls: listOfURLs}); 

post工作正常,如果它不包含的URL,但是,如果有包含的URL,然後我得到:

POST script.php 403 (Forbidden) 

有沒有什麼方法可以淨化這個URL列表或者是爲了防止它被403ing?

所涉及的一切都在同一個域上。

+0

是你的網站在線??? –

+0

是的它在線。 – brentonstrine

+0

給出您使用此代碼的頁面的鏈接? –

回答

3

至於我可以看到:這個「錯誤」是在服務器端。

將作爲第二個參數傳遞給$.post()方法的對象簡單地序列化爲請求中的數據。

您可以通過檢查瀏覽器的Web控制檯(例如:Firebug的「Net」選項卡,或Firefox內置控制檯的「Network」選項卡或Chrome中的類似選項卡來查看發送到服務器的內容或IE)。我的猜測是你的請求是正確地與你提供的數據一起發送的。

你的服務器用這些數據做什麼是另一回事;您需要調試您的服務器配置和服務器端代碼,以確定您的請求最終如何觸發403

403的一個可能原因是文件權限不正確。檢查您的文件權限是否允許Web服務器訪問它們。

例如,如果您使用的是標準的Apache/Linux配置,檢查:

  • 用戶www-data對所有代碼目錄
  • 用戶www-data對所有代碼文件r權利x權利
  • 用戶www-data對應該下載或上傳的文件有正確的權利
  • 您的站點配置文件從某些直接刪除訪問法制前提
  • .htaccess文件(S)從某些目錄
  • 等移除訪問...
+0

我想他說他只有在發送'urls:listOfURLs'時纔得到403。 – sam

+0

對不起錯過賞金窗口......這就是問題所在。在我不知道的情況下,服務器上出現了一些瘋狂的安全事件,將我的POST標記爲惡意並阻止它們。 – brentonstrine

+0

更改寫入允許工作的權限 – ToughPal

3

這完全取決於你的listOfURLs是什麼,你只需要記住的是,POST請求的數據部分,應該永遠是一個字符串,所以解決方案可能是:

  • 如果ListOfURLs是一個數組,你應該這樣做:

    $ .post(「script.php」,{'urls []':[「URL1」,「URL2」]});

  • 如果是表單數據,則可以將其序列化爲一個json字符串。

  • 如果沒有任何的那個,儘量使它像json一樣。

,並請,如果這也不行,爲我們提供有關數據本身

+0

也嘗試[$ .param](http://api.jquery.com/jQuery.param/)(listOfURLs,true) – sam

1

403告訴你一些額外的細節,該系統試圖訪問一個網址或資源使用,您對對象試圖發送。

我不是這個ajax調用的簡短形式的粉絲。如果您想了解更多代碼概述,請使用long syntax of JQuerySee this for more information.

$.ajax({ 
    type: "POST", 
    url: url, 
    data: listofURLs2JSON, 
    dataType: "json", 
    statusCode: { 
     404: function() { 
      alert("List of urls. Nooooo"); 
     } 
    }, 
    success: function(data) { 
     alert("This was totally awesome!"); 
    }, 
}); 

正如Labib指出的那樣,您可以避免使用JSON的403。反序列化對象使用JSON.stringify

var listofURLs2JSON = JSON.stringify(array/object, callback); 

然後你就可以接收對象爲字符串,並使用PHP的功能,如json_decode檢索數據爲變量,做你想做的,併發送回通過json_encode

列表中的網址,然後
1

試URL編碼傳遞給它

var encodedUrl = encodeURIComponent(url); 
0

。在你的代碼中的錯誤。與此

$.post("script.php", { 'urls[]': listOfURLs}); 

因爲listOfURLs是一個JavaScript 陣列

$.post("script.php", { urls: listOfURLs}); 

:此時應更換此。這可以解釋爲什麼你的代碼在URL列表爲空時工作。

post()文檔頁面上的第三個例子:jQuery.post() |jQuery API

如果不幫助我將嘗試使用Fiddler2在當它後你的代碼正在調用密切關注。該程序將顯示正在調用的URL和發佈的數據。這對於調試這類問題非常有用。

0

您是否使用Nginx作爲您的Web服務器? Nginx不支持這樣的發佈請求;您可以通過將以下內容添加到服務器下的配置來解決此限制。

error_page 405 =200 $request_uri; 

什麼是實際發生的是Nginx的是生成HTTP響應405,然後試圖訪問錯誤文檔HTTP 405並獲得對所顯示403。