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

时间:2011-12-17 17:01:11

标签: 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;

然而,这会导致错误:HTTP1.1 / 403 Forbidden

IdHTTP组件已设置为具有以下属性。

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

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

我是否必须为IdHTTP组件设置任何其他属性。我只在about表单上有这个组件。我还需要其他任何东西。

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

我在这里只使用“test”代替我的实际程序名称和URL。

此致 阿德里安

3 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:-1)

The answers given did not work for me until i put all of them together.

//add Request.Username and supply the correct mysql username
tidHttpObject.Request.Username := 'username';

//do the same for the password
tidHttpObject.Request.Password := 'password';

//then add a UserAgent property with the string below
tidHttpObject.Request.UserAgent :=  'Mozilla/5.0 (Windows NT 6.1; WOW64;
rv:12.0) Gecko/20100101 Firefox/12.0';

//finally call the get() url method of the tidHttp object
Result :=  tidHttpObject.Get(url);