2011-12-17 5 views
4

Я пытаюсь получить доступ к файлу update.txt на своем веб-сайте, используя скомпилированную программу DelphiXE и компонент IdHTTP.IdHTTP.get return HTTP1.1/403 Forbidden

код я использую следующим образом:

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) 

Если я ввожу URL в браузере IE, он возвращает файл без ошибок, но при доступе из моей программы, я получаю сообщение об ошибке. Любые указатели будут оценены. .htaccess верен для сайта. Права на файл указаны на веб-сайте: 0644.

Должен ли я устанавливать какие-либо другие свойства для компонента IdHTTP. У меня есть только этот компонент в форме. Мне нужно что-нибудь еще.

Файл updateinfo.txt просто содержит текст в кавычках: «18.3.5,2011/12/17»

я просто использовал «тест» здесь на месте моего фактического имени программы и URL.

С уважением Адриан

+0

Вы используете HTTPS? – TLama

+0

Нет, я не использую HTTPS. –

ответ

6

403 означает, что у вас нет разрешения на доступ к запрошенному URL. Вероятно, серверу требуется указать имя пользователя/пароль, особенно если вы используете файл .htaccess. Используйте свойства Request.UserName и Request.Password. Что касается того, почему браузер не запрашивает имя пользователя/пароль, я предполагаю, что браузер кэширует их из более раннего доступа.

BTW, ваш SpeedButtonUpdateClick() имеет утечку памяти. Вы создаете новый объект TIdHTTP, но вы не освобождаете его.

+0

Hello Remy, у меня нет имени пользователя или пароля для сайта. Я могу получить доступ к URL из веб-браузера на другом ПК, который не принадлежит мне. Thx для утечки памяти .. просто пример кода, но вы правы, его нужно освободить. –

+5

Затем используйте сниффер пакетов, например Wireshark, чтобы посмотреть, как выглядят HTTP-запросы из вашего браузера и TIdHTTP, а затем сравнивают их с различиями. Оффлайн, возможно, вашему серверу не нравится значение 'Request.UserAgent', которое вы используете. Некоторые серверы чувствительны к UserAgent. –

+0

Я тоже беспокоился о Request.UserAgent и пробовал много вариантов, без каких-либо успехов. –

6

Я столкнулся с той же проблемой при использовании функции Get() Indy.

Это более чем вероятно, что вы получаете эту ошибку, потому что вы не установили свойство 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

+0

этот код утечки экземпляра TIdHTTP – mjn

-1

ответы, даваемые не работает для меня, пока я не положил их все вместе.

//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);