IdHTTP.get返回HTTP1.1/403禁止

Adr*_*ord 4 delphi indy10 idhttp

我正在尝试使用DelphiXE编译程序和IdHTTP组件访问我网站上的update.txt文件.

我正在使用的代码如下:

procedure TFormAbout.SpeedButtonUpdateClick(Sender: TObject);

function CheckUpdates: String;
var lIdHttp: TIdHTTP;
begin
  lIdHttp := TIdHTTP.Create(nil);
  result := lIdHttp.Get('http://www.test.com/test_down_load/update.txt');
end;

var
sWebVersion: String;
sVersionList: TStringList;

begin
try
  sWebVersion := Checkupdates;
except
  on E: Exception do
  begin 
    ShowMEssage(E.ErrorMessage);
    MessageDlg('An Error occured checking for an update.',mtError,[mbOK],0);
  end;
end;
if sWebVersion <> '' then
  begin
    sVersionList.CommaText := sWebVersion;
    ShowMessage('Version: ' + sVersionList[0] + ' - ' + 'Date: ' + sVersionList[1]);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

但是会导致错误:HTTP1.1/403禁止

已使用以下属性设置IdHTTP组件.

HandleRedirects := true;
HTTPOptions [hoForceEncodeParams];
ProtocolVersion := pv1_1;
Request.UserAgent := Mozilla/5.0 (compatible; Test)
Run Code Online (Sandbox Code Playgroud)

如果我在IE浏览器中输入URL,它会返回没有错误的文件,但是从我的程序访问时,我收到错误.任何指针将不胜感激..htaccess对于该网站是正确的.该文件的权限在网站上是正确的:0644.

我是否必须为IdHTTP组件设置任何其他属性.我只在about表单上有这个组件.我还需要别的吗?

updateinfo.txt文件只包含引号中的文本:"18.3.5,2011/12/17"

我这里只是用"test"代替我的实际程序名和URL.

关心阿德里安

The*_*ven 7

当使用Indy的Get()函数时,我遇到了完全相同的问题.

很可能是因为你没有设置UserAgent属性而网站知道你没有访问该文件,因为浏览器正在大惊小怪.

function CheckUpdates: String;
var lIdHttp: TIdHTTP;
begin
  lIdHttp := TIdHTTP.Create(nil);
  //avoid getting '403 Forbidden' by setting UserAgent
  lIdHttp.Request.UserAgent :=
      'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
  result := lIdHttp.Get('http://www.test.com/test_down_load/update.txt');
end;
Run Code Online (Sandbox Code Playgroud)

类似的问题,但正确的答案记录在这里:https: //stackoverflow.com/questions/10870730/why-do-i-get-403-forbidden-when-i-connect-to-whatismyip-com


Rem*_*eau 6

403表示您无权访问请求的URL.服务器可能要求您提供用户名/密码,尤其是因为您使用的是.htaccess文件.使用Request.UserNameRequest.Password属性.至于为什么浏览器不要求用户名/密码,我的猜测是浏览器从早期访问中缓存它们.

顺便说一句,你SpeedButtonUpdateClick()的内存泄漏.您正在创建一个新TIdHTTP对象,但您没有释放它.

  • 然后使用数据包嗅探器(如Wireshark)来查看来自浏览器和TIdHTTP的HTTP请求,然后将它们与差异进行比较.另外,也许你的服务器不喜欢你正在使用的`Request.UserAgent`的值.某些服务器对UserAgent敏感. (5认同)
  • 你好雷米,其实问题在于我.正如你在代码中看到的那样,我正在创建TIdHTTP,但是没有更改它的Request.UserAgent,而是我在表单上删除了IdHttp1组件,因此默认的Mozilla/3.0(兼容; Indy Library)正在发送,而不是我以为我一直在发送的东西.因此,我对component.properties和测试所做的所有更改都没有通过.在创建lIdHttp之后添加这行代码:lIdHttp.request.useragent:='Mozilla/5.0(兼容; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)'; Thx Adrian (5认同)