PHP、Apache 和 curl:Windows 和 Linux 之间的区别?

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 感染,因此访问可以限制在本地主机。

可能的问题有:

  • 对于通过 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);
    
  • 其他?

Apache 日志显示:

[错误] /myApp/webservice/local/viewList.php 的 NTLM/Basic 授权标头错误/缺失

但此目录应覆盖 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-与curl-on-windows有什么区别 有人建议我将其发布在这里吗?

编辑:

请参见

Ubuntu 服务器:Apache2 似乎将 .php 附加到 URI

正如我所发现的,为什么它不起作用,但需要帮助,所以问题不再发生。

回答:

问题是 Ubuntu 上的默认 Apache 配置:

Options Indexes FollowSymLinks MultiViews

MultiViews 正在将 request_uri 从 myResource 更改为 myResource.php。

解决方案:

  • 在 .htaccess 中禁用 MultiViews:选项 -MultiViews
  • 从默认配置中删除 MultiViews
  • 将文件重命名为 myResourceClass

我选择了最后一个选项,因为无论配置如何它都应该有效,而且我只有 3 个这样的文件,所以更改大约需要 30 秒......

答案1

问题是 Ubuntu 上的默认 Apache 配置:

Options Indexes FollowSymLinks MultiViews

MultiViews 正在将 request_uri 从 myResource 更改为 myResource.php。

解决方案:

  • 在 .htaccess 中禁用 MultiViews:选项 -MultiViews
  • 从默认配置中删除 MultiViews
  • 将文件重命名为 myResourceClass

我选择了最后一个选项,因为无论配置如何它都应该有效,而且我只有 3 个这样的文件,所以更改大约需要 30 秒......

相关内容