PHP、Apache 和 curl:Windows 和 Linux 的區別?
我正在嘗試在 Ubuntu Server 11.10 上執行我的 php 應用程序。這個應用程序在 Windows 中的 Apache + PHP 下執行良好。我還有其他應用程序,我可以簡單地在 2 個作業系統之間複製和粘貼,它們都可以在這兩個作業系統上執行。(這些不使用 cURL)。
然而,這個使用了 php 庫 tonic(RESTful webservices)並使我們使用了 php cURL 模組。問題是我沒有收到錯誤消息,因此無法找到問題。
我(必須)使用 NTLM 身份驗證,這是通過 AuthenNTLM Apache 模組完成的:
Order allow,deny Allow from all PerlAuthenHandler Apache2::AuthenNTLM AuthType ntlm AuthName "Protected Access" require valid-user PerlAddVar ntdomain "domainName server" PerlSetVar defaultdomain domainName PerlSetVar ntlmsemtimeout 2 PerlSetVar ntlmdebug 1 PerlSetVar splitdomainprefix 0
cURL 需要獲取的所有文件都會覆蓋 AuthenNTLM 身份驗證:
order deny,allow deny from all allow from 127.0.0.1 Satisfy any
由於這些文件僅受來自同一伺服器的 cURL 感染,因此可以將訪問限制為 localhost。
可能的問題是:
- 通過 cURL 請求的文件不會覆蓋 NTLM 身份驗證(即使設置了 AllowOverride All)
- curl 在 Linux 上的工作方式不同
$ch = curl_init(); curl_setopt($ch, CURLOPT_COOKIE, $strCookie); curl_setopt($ch, CURLOPT_URL, $baseUrl . $queryString); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $html = curl_exec($ch); curl_close($ch);
- 其他?
阿帕奇日誌說:
$$ error $$/myApp/webservice/local/viewList.php 的錯誤/缺少 NTLM/基本授權標頭 但是這個目錄應該覆蓋 NTLM 身份驗證
使用 Windows 中的 curl 命令行訪問我得到的相同資源:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head> <title>406 Not Acceptable</title> </head> <body> <h1>Not Acceptable</h1> <p>An appropriate representation of the requested resource /myApp/webservice/myResource could not be found on this server.</p> Available variants: <ul> <li><a href="myResource.php">myResource.php</a> , type application/x-httpd-php</li> </ul> <hr> <address>Apache/2.2.20 (Ubuntu) Server at localhost Port 80</address> </body> </html>
筆記:
這是來自https://stackoverflow.com/questions/9821979/php-curl-on-linux-what-is-the-difference-to-curl-on-windows的重複 內容是否建議我將其發佈在這裡。
編輯:
請參見
Ubuntu 伺服器:Apache2 似乎將 .php 附加到 URI
因為我發現了為什麼它不起作用但需要幫助,所以問題不再發生。
回答:
問題是 Ubuntu 上的預設 Apache 配置:
Options Indexes FollowSymLinks MultiViews
MultiViews 正在將 request_uri 從 myResource 更改為 myResource.php。
解決方案:
- 在 .htaccess 中禁用多視圖:選項 -MultiViews
- 從預設配置中刪除 MultiViews
- 將文件作為範例重命名為 myResourceClass
我選擇了最後一個選項,因為無論配置如何,它都應該可以工作,而且我只有 3 個這樣的文件,所以更改大約需要 30 秒……
問題是 Ubuntu 上的預設 Apache 配置:
Options Indexes FollowSymLinks MultiViews
MultiViews 正在將 request_uri 從 myResource 更改為 myResource.php。
解決方案:
- 在 .htaccess 中禁用多視圖:選項 -MultiViews
- 從預設配置中刪除 MultiViews
- 將文件作為範例重命名為 myResourceClass
我選擇了最後一個選項,因為無論配置如何,它都應該可以工作,而且我只有 3 個這樣的文件,所以更改大約需要 30 秒……