IdHTTP.obtenez de retour HTTP1.1/ 403 Forbidden
J'essaye d'accéder à un update.txt fichier sur mon site web, à l'aide d'un DelphiXE programme compilé et le IdHTTP composant.
Le code que j'utilise est comme suit:
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;
Cela se traduit cependant par erreur: HTTP1.1/403 Forbidden
La IdHTTP composant a été mis en place avec les propriétés suivantes.
HandleRedirects := true;
HTTPOptions [hoForceEncodeParams];
ProtocolVersion := pv1_1;
Request.UserAgent := Mozilla/5.0 (compatible; Test)
Si j'entre l'URL dans un navigateur IE, il renvoie le fichier sans erreur, mais lors de l'accès à partir de mon programme, j'obtiens l'erreur.
Tous les pointeurs seront appréciées.
.htaccess est correct pour le site.
Les autorisations pour le fichier sont corrects sur le site: 0644.
Dois-je définir d'autres propriétés de l'IdHTTP composant. Je n'ai que ce composant sur le sur le formulaire. Dois-je besoin d'autre chose.
L'updateinfo.txt le fichier ne contient que le texte entre des guillemets:
"18.3.5,2011/12/17"
J'ai simplement utilisé de "test" ici, à la place de mon programme nom et l'URL.
Ce qui concerne
Adrian
Non, je n'utilise pas le protocole HTTPS.
OriginalL'auteur Adrian Wreyford | 2011-12-17
Vous devez vous connecter pour publier un commentaire.
403 signifie que vous n'avez pas la permission d'accéder à l'URL demandée. Le serveur requiert probablement afin de vous fournir un nom d'utilisateur/mot de passe, surtout depuis que vous êtes en utilisant un .fichier htaccess. Utiliser le
Request.UserName
etRequest.Password
propriétés. Quant à savoir pourquoi le navigateur ne demande pas de nom d'utilisateur/mot de passe, je suppose que le navigateur a mis en cache à partir d'un accès plus rapide.BTW, votre
SpeedButtonUpdateClick()
a une fuite de mémoire. Vous êtes à la création d'un nouveauTIdHTTP
objet, mais vous n'êtes pas en le libérant.Ensuite, utilisez un renifleur de paquets, tels que Wireshark pour voir ce que les requêtes HTTP à partir de votre navigateur et TIdHTTP, puis de les comparer entre eux des différences. Désinvolte, peut-être que votre serveur n'aime pas la valeur de la
Request.UserAgent
que vous utilisez. Certains serveurs sont UserAgent sensibles.J'étais inquiet au sujet de la Demande.UserAgent trop, et j'ai essayé beaucoup de variations, sans succès.
Bonjour Remy, en Fait, le problème réside avec moi. Comme vous pouvez le voir dans le code, je suis la création de TIdHTTP, mais n'a pas été changer sa Demande.UserAgent, mais le IdHttp1 composant que j'avais déposée sur la forme, donc la valeur par défaut de Mozilla/3.0 (compatible; Indy Bibliothèque) a été envoyé, et pas ce que je pensais de l'envoi de tous. Donc tous les changements que je faisais pour le composant.les propriétés et les tests n'ont jamais été en passant par. L'ajout de cette ligne de code n'a après les de créer de la lIdHttp: lIdHttp.demande.useragent : = " Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)'; Thx Adrian
Pour info, je viens il y a quelques minutes vérifié dans une mise à jour où le défaut
TIdHTTP.Request.UserAgent
est maintenant personnalisable. Il y a un nouveauGIdDefaultUserAgent
variable globale dans laIdHTTPHeaderInfo.pas
unité. Au lieu de définirTIdHTTP.Request.UserAgent
séparément pour chaqueTIdHTTP
objet utilisé, vous pouvez maintenant définirGIdDefaultUserAgent
une fois au démarrage du programme et tous lesTIdHTTP
demande de l'utiliser (vous pouvez toujours utiliserTIdHTTP.Request.UserAgent
pour remplacer leUserAgent
sur une demande de base, si nécessaire).OriginalL'auteur Remy Lebeau
Je rencontre exactement le même problème lors de l'utilisation d'Indy Get() de la fonction.
Il est plus que probable que vous obtenez ce message, car vous n'avez pas défini de la propriété UserAgent et le site en sachant que vous n'êtes pas accéder au fichier car un Navigateur est à coups de pied jusqu'à une histoire.
La même question, mais la réponse correcte a été enregistré ici:
https://stackoverflow.com/questions/10870730/why-do-i-get-403-forbidden-when-i-connect-to-whatismyip-com
OriginalL'auteur TheSteven
Les réponses données n'a pas fonctionné pour moi jusqu'à ce que j'ai mis tous ensemble.
OriginalL'auteur Bernard Sibanda