php程式是部署在IIS7上面,ajax提交資料時,遇到了兩個問題,一個就是跨域,一個php程式總是會被執行兩次。
第一個問題的解決方法,是百度出來的,加入下面幾行程式碼就可以了:
header('Access-Control-Allow-Origin:*');
header("Access-Control-Allow-Headers: x-requested-with,content-type");
header('Access-Control-Allow-Methods: OPTIONS,POST,GET');
其實,也可以直接在iis裡面設置,不用添加代碼,直接選擇站點,然後點右邊的http響應標頭,在裡面直接配好,就可以了。如圖:
第二個問題,一直沒有百度出結果,只好FQ用google,一下就看明白了,然後順著線索找,終於理清楚了。
在CORS .net 跨域解決方案裡,是這樣介紹的(http://jingyan.baidu.com/article/03b2f78c190ad25ea237ae33.html)
同一個請求需要兩個相同請求地址的方法,一個標記為“POST”,另一個標記為“OPTIONS“,實體方法為標記”POST“的方法,這裡”OPTIONS“方法不需要做任何邏輯操並且傳回值為void即可(其實OPTIONS請求為瀏覽器的校驗,髮帶參數的POST請求時瀏覽器會先發一個OPTIONS請求,檢驗request 頭資訊和response頭資訊一致後才真正發起POST請求)
抓包發現,確實如此,瀏覽器產生了兩個請求,OPTIONS service/service.php HTTP/1.1和POST /service/service.php HTTP/1.1
本想著像文中說的那樣,讓請求OPTIONS時,直接返回void,但是在看到配置php的時候,可以直接限制動作。試了一下,果然有用,現在ajax跨域,php程式只執行一次了。
iis裡配置方法如下:找到php程式站點,也可以選擇伺服器設置,點右邊的處理程序映射,找到php,點編輯,在彈出對話框裡,點請求限制,再選謂詞,點下面謂詞之一,按照提示的輸入GET,POST,我是之前為了省事,直接是預設選項(全部謂詞),所以才遇到了這個問題。 如圖: