2013-03-08 111 views
3

在部署版本Django的網站我的工作,以微軟的Azure服務的,我添加了一個頁面,這需要查詢字符串像微軟Azure追加額外的查詢字符串查詢字符串的URL

http://<my_site_name>.azurewebsites.net/security/user/?username=<some_username>&password=<some_password> 

然而,我收到了404條對這個URL的迴應。於是我打開Django的調試標誌,我得到返回的頁面說:

Page not found (404) 
Request Method:  GET 
Request URL: http://<my_site_name>.azurewebsites.net/security/user/?username=<some_username>&password=<some_password>?username=<some_username>&password=<some_password> 


Using the `URLconf` defined in `<my_project_name>.urls`, Django tried these URL patterns, in this order: 

^$ 
^security/ ^user/$ 
^account/ 
^admin/ 
^api/ 

The current URL, `security/user/?username=<some_username>&password=<some_password>`, didn't match any of these. 

所以它似乎是追加查詢字符串到的是已經有相同的查詢字符串的URL的結尾。我在本地計算機上運行該站點,並在內部網絡上的iis服務器上運行該服務器,在推送到Azure之前,該服務器用於分級。這些站點部署都沒有這樣做,所以這似乎是Azure特有的。

有什麼我需要在Azure網站管理界面中設置,以防止它使用查詢字符串修改URL?有沒有什麼我做錯了與Azure使用查詢字符串?

+0

我發現了另一個似乎與我非常相似的問題:http://stackoverflow.com/questions/12698625/query-string-get-appened-more-than-once但我不知道如何實現建議Azure上的解決方案。不是關於重寫強制https的部分,只是阻止查詢字符串加倍的部分。 – Alex 2013-03-08 20:13:40

+0

進一步研究,我已將問題追蹤到path_info變量。我正在使用由Django提供的WSGIHandler,它使用Azure中的get_wsgi_application()作爲WSGI_HANDLER應用程序設置,如本教程所示,我應該這樣做:http://www.windowsazure.com/en-us/develop/python/tutorials/web -sites-with-django /。查看處理程序從環境變量中收到的信息,看起來好像QUERY_STRING是空的,而PATH_INFO有完整的url +查詢字符串。這似乎是導致我的問題。不知道這是否是fastcgi或iis的問題。 – Alex 2013-03-11 19:04:29

+0

更正以上評論。 QUERY_STRING不是空的。這是我嘗試擺脫使用url重寫的雙重查詢字符串的錯誤我通過Web.config文件刪除了查詢字符串。現在問題的根源在於PATH_INFO包含查詢字符串,並且Django WSGI處理程序不期望它。 – Alex 2013-03-11 22:16:48

回答

0

在與wfastcgi.py的提供者交談時,他們告訴我這可能是導致此問題的wfastcgi.py的問題。當他們看着它時,他們給了我一個解決問題的方法。

http://pytools.codeplex.com/releases

下載wfastcgi.py的最新副本,在該文件中找到這部分代碼:

if 'HTTP_X_ORIGINAL_URL' in record.params: 
    # We've been re-written for shared FastCGI hosting, send the original URL as the PATH_INFO. 
    record.params['PATH_INFO'] = record.params['HTTP_X_ORIGINAL_URL'] 

並添加正確的下方(仍然是,如果塊的一部分):

# PATH_INFO is not supposed to include the query parameters, so remove them 
record.params['PATH_INFO'] = record.params['PATH_INFO'].split('?')[0] 

然後,在上傳/部署該修改的文件,以在Azure網站(無論是使用ftp把它某處或將其添加到您的網站的部署。我部署它,這樣,如果我需要進一步修改它的版本和備份。

在站點的Azure管理頁面中,轉至站點的配置頁面,並更改處理程序映射以指向修改的wfastcgi.py文件並保存配置。

即我的處理程序曾經是默認的D:\ python27 \ scripts \ wfastcgi.py。由於我部署了我的修改文件,處理程序路徑現在爲:D:\ home \ site \ wwwroot \ wfastcgi.py

我也重新啓動了該網站,但您可能不必。

這個修改後的腳本現在應該去掉PATH_INFO中的查詢字符串,並且帶查詢字符串的網址應該可以工作。我將使用它,直到我從wfastcgi.py開發人員那裏聽說Python27安裝中的默認wfastcgi.py文件已被修復/替換。