2009-09-07 43 views
1

我在Windows上以控制檯模式運行Apache 2.2.13。我製作了處理請求的可執行文件。在某些情況下,當它檢測到指向目錄的URL但沒有結尾斜槓時,它會嘗試重定向到缺少斜槓的URL。退出代碼設置爲301。奇怪的是,有這個在響應頭不起作用:Apache CGI重定向到絕對URI不起作用

Location: /cgi-bin/mycgi.exe/something/ 

但確實:

Location: something/ 

難道我做錯了什麼?還是我在Apache中發現了一個錯誤? (如果是這樣,我應該在哪裏以及如何發佈它最好?)

回答

1

一般,'位置'包含完整的網址,包括h ttp:和主機名。 DVK概述了這種情況。

地點:/cgi-bin/mycgi.exe/something/

這其實是別的東西:內部重定向。它由the CGI specification定義,並可用於從CGI派生的其他一些服務器環境,例如PHP。當「位置」包含「虛擬路徑」時,Apache立即在該路徑中提供頁面/腳本,而瀏覽器不知道有任何類型的重定向。

顯然,這不是你想要的,因爲它沒有意義的,做一個301內部重定向時,瀏覽器將永遠不會看到這是一個301

位置:東西/

此,另一方面,什麼也不是。它不是一個完整的URL,它不是一個虛擬路徑,因爲它不以'/'開頭。 Apache不知道該如何處理它,所以它只是猜測它不是一個虛擬路徑,因此將其返回給瀏覽器而無需進一步評論。

把'位置'標題發送到瀏覽器是無效的,但是它們中的許多都會允許它,這就是爲什麼它看起來有效。真的,你應該通過完整的URL:

Location: http://www.example.com/cgi-bin/mycgi.exe/something/ 
+0

謝謝。我將修改'重定向前綴'以包含「http://」和「HTTP_HOST」env值 – 2009-09-08 07:34:22

0

1)要清楚,重定向功能(例如「看到時應該做什麼」位置:http響應)在您的瀏覽器中,而不是在Apache 。我假設你知道,但想確保清楚。它與此相關的原因是因爲as per the RFC,301響應中的地址需要是「單個絕對URI」。因此,您的URI示例缺少您的域名,例如需要是http://your.web.server/cgi-bin/mycgi.exe/something/

雖然有些網絡客戶端接受301與相對重定向,其他人不。

2)您能否詳細說明您的意思是「不起作用」,包括客戶端的錯誤和Apache日誌中的任何錯誤?由於

另外,請指定下列URL從客戶端的工作,哪些沒有:

感謝

+0

調試時,我注意到mycgi.exe正在一再呼籲,所有與「REDIRECT_」爲前綴的環境變量的完整副本,但沒有更新「REQUEST_URI 「,所以這會循環,env-vars的重複(」REDIRECT_REDIRECT_REDIRECT _...「)會打破這個循環,並導致Apache顯示服務器錯誤通知頁面。 – 2009-09-08 07:38:03