6

我在http://mlecturedownload.com/test-qt.php有一个测试页面设置,其中包含以下代码:

<?php

$foo = $_GET['foo'];
if ($foo == "0" || $foo == "1") {
  echo $foo;
} else {
  echo "Invalid foo";
}

在网络浏览器中访问此页面并修改 foo 的值可以正常工作,使用 curl 也可以正常工作。但是当我从 Qt 发送请求时,我得到一个 HTTP 406 错误代码,这意味着“不可接受”。这是我提出请求的方式:

void MainWindow::on_send_clicked()
{
    QString url = "http://mlecturedownload.com/test-qt.php?foo=1";

    QNetworkRequest request;
    request.setUrl(QUrl(url));
    nam->get(request); // nam is a QNetworkAccessManager
}

这是从 Wireshark 获得的整个 HTTP 请求和响应

GET /test-qt.php?foo=1 HTTP/1.1
Connection: Keep-Alive
Accept-Encoding: gzip, deflate
Accept-Language: en-CA,*
User-Agent: Mozilla/5.0
Host: mlecturedownload.com

HTTP/1.1 406 Not Acceptable
Date: Sat, 19 Jan 2013 17:14:37 GMT
Server: Apache
Content-Length: 275
Keep-Alive: timeout=5, max=75
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

<head><title>Not Acceptable!</title><script src='/google_analytics_auto.js'></script></head><body><h1>Not Acceptable!</h1><p>An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.</p></body></html>

看起来服务器上名为 mod_security 的 Apache 模块导致了问题。有一些方法可以通过 .htaccess 禁用它,但没有一个对我有用。但我宁愿解决问题而不是禁用模块。有谁知道发生了什么?

编辑:我发布的网站链接托管在 HostGator 上。我在我的 EC2 服务器上创建了一个测试页面,它运行良好,可能是因为我没有启用该安全模块。我仍然需要让它在 HostGator 服务器上运行。

4

3 回答 3

9

我遇到了同样的问题 - 尝试下载文件时出现“不可接受”错误。我做了一些谷歌搜索和实验,我发现添加:

request.setRawHeader( "User-Agent" , "Mozilla Firefox" );

在 get(request) 改变结果之前。:)

我猜QNetworkRequest的用户代理服务器无法识别,这导致了 406 错误消息。我需要做更多的测试,但我认为我应该分享我的突破。我希望它有帮助...

于 2013-02-20T08:44:27.503 回答
1

以下解决方案对我来说很划算:

    request.setRawHeader( "Accept" , "*/*" );
于 2015-10-05T14:12:01.070 回答
0

它更像是一个被阻止的用户代理。将用户代理标头设置为其他任何内容,它应该可以正常工作。

request.setHeader(QNetworkRequest::UserAgentHeader, "Whatever you like");

http://amin-ahmadi.com/2016/06/13/fix-modsecurity-issues-in-qt-network-module-download-functionality/

于 2016-06-13T15:03:58.257 回答