Apache-2.2

PHP、Apache 和 curl:Windows 和 Linux 的區別?

  • March 26, 2012

我正在嘗試在 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 秒……

引用自:https://serverfault.com/questions/372637