Puis-je définir globalement $ _SERVER ['REDIRECT_URL'] avant l'exécution du script?

8

Je suis en train de migrer de nombreux sites d'une ancienne à une nouvelle configuration de serveur. Chaque site est basé sur une base de code similaire (mais malheureusement pas identique), utilisant des URL mod_rewrite.

  • Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
  • Apache 2.22.8 => Apache 2.2.22
  • PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)

Fonctionnant principalement comme un charme, mais sur la nouvelle configuration, $ _SERVER ['REDIRECT_URL'] n'est plus défini, et le code échoue en raison d'une dépendance à cette variable globale.

D'après ce que je comprends, cette variable est définie par Apache lorsqu'une redirection se produit. Évidemment, cela ne se produit pas maintenant, mais j'ai du mal à trouver la cause.

  • S'agit-il de la mise à niveau d'Apache ou (à mon avis) du passage de PHP FastCGI à PHP5-FPM?
  • Comment récupérer cette variable?

Je préfère vraiment ne pas avoir à éditer le code sur chaque site, je vais donc définir un auto_prepend PHP global si nécessaire, mais idéalement, je voudrais corriger la configuration du serveur et avoir cet ensemble en premier lieu.

Potentiellement lié: j'ai maintenant quelques nouvelles variables $ _SERVER, à savoir REDIRECT_SCRIPT_URL et REDIRECT_REDIRECT_SCRIPT_URL. Ceux-ci semblent avoir les données correctes que je veux pour REDIRECT_URL, mais semblent également indiquer qu'il y a deux redirections internes qui ne se produisaient pas auparavant - Google recherche REDIRECT_REDIRECT_SCRIPT_URL ne renvoie que des sorties var_dump aléatoires. SCRIPT_URL est-il le nouveau REDIRECT_URL?

Modifier 1

Vérifier à nouveau REDIRECT_URL est (maintenant) défini, mais toujours sur 'index.php' (la cible mod_rewrite) au lieu de l'URL typée attendue. J'ai eu recours à un fichier PHP auto_prepend_file pour définir manuellement la variable nécessaire.

Je ne sais pas comment je l'ai raté la première fois, mais j'ai fait plusieurs changements entre-temps, donc je suppose qu'il y a une chance extérieure qu'il n'y soit pas. Toutes mes excuses si cela induit quelqu'un en erreur.

Modifier 2

Pour répondre aux mentions de ErrorDocument ci-dessous, la règle mod_rewrite utilisée est:

RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]

La variable $ _GET ['url'] est définie, la règle doit donc fonctionner.

Pour être clair, à ce stade, je suis allé avec la solution de contournement auto_prepend_file que j'ai mentionnée initialement.

Barry
la source
-1 pour ne pas avoir fait preuve de diligence raisonnable. Une recherche rapide sur Google ne remplace pas la lecture de la documentation. Avant de mettre à niveau des systèmes ou du code, vous devez vous assurer de comprendre ce qui a changé, au moins dans la mesure où cela affecte vos systèmes ou projets.
John Gardeniers
Toutes mes excuses pour ne pas être clair; J'ai lu la documentation du mieux que j'ai pu voir. Ensuite, j'ai recouru à Google quand je suis tombé sur quelque chose que je ne pouvais pas expliquer. La configuration est sur une machine distincte et lors des tests de pré-déménagement, j'ai découvert le problème ci-dessus. J'ai toutefois trouvé une erreur que j'ai commise, je vais donc mettre à jour la question.
Barry
c'est vraiment dans votre intérêt et dans notre intérêt si vous nous dites ces choses dès le départ. J'ai inversé mon vote.
John Gardeniers
Pouvez-vous nous donner plus d'informations sur la configuration du serveur précédente et nouvelle? Le paramètre de REDIRECT_URL en PHP provient de la variable d'environnement SCRIPT_URL dans apache je pense, mais il y a beaucoup de choses qui peuvent modifier le comportement de cette importation (par exemple, suPHP, moteurs d'encapsulation, instructions AddTypeHandler, etc.).
Jon Kloske

Réponses:

3

REDIRECT_URL est défini uniquement par le serveur Web Apache et uniquement dans certaines circonstances . Ce n'est probablement pas quelque chose sur lequel votre code devrait s'appuyer. Pour autant que je sache, la meilleure solution serait de corriger le code PHP buggé; vous ne pouvez pas vraiment forcer cela à être toujours défini dans Apache.

Michael Hampton
la source
Merci pour la réponse, mais je n'ai malheureusement rien vu sur ce lien lié à mon problème. Je ne pense pas qu'un document d'erreur externe soit impliqué dans cela. J'aimerais pouvoir changer le code existant, mais ce n'est pas une option pour le moment.
Barry
Le fait est que REDIRECT_URL n'est défini que pendant le traitement ErrorDocument. Cela signifie que vos scripts PHP ont été chargés en tant que ErrorDocuments dans la configuration d'origine, et quiconque les a écrits s'est appuyé sur ce comportement. Maintenant que cela ne se produit pas, les scripts se cassent.
Michael Hampton
Il n'y a pas de définitions ErrorDocument en cours d'utilisation, et je ne vois pas comment la mod_rewrite RewriteRule (ajoutée ci-dessus) en implique une. Je ne suis pas d'accord avec vous sur le fait que REDIRECT_URL n'est pas garanti, je ne trouve tout simplement aucune documentation pertinente expliquant pourquoi.
Barry
Je l'ai lié ci-dessus dans ma réponse. Si vous avez besoin de quelque chose de plus, vous devrez lire le code source d'Apache. Quoi qu'il en soit, n'oubliez pas d'accepter la réponse qui a résolu votre problème en cliquant sur le contour de la coche à côté, et bienvenue dans Server Fault.
Michael Hampton
0

Selon la documentation de PHP:

$ _SERVER est un tableau contenant des informations telles que les en-têtes, les chemins et les emplacements des scripts. Les entrées de ce tableau sont créées par le serveur Web. Il n'y a aucune garantie que chaque serveur Web fournira ces informations; les serveurs peuvent en omettre certains ou en fournir d'autres non répertoriés ici. Cela dit, un grand nombre de ces variables sont prises en compte dans la spécification »CGI / 1.1 , vous devriez donc pouvoir vous y attendre.

Il semblerait donc que toutes les $_SERVERvariables superglobales ne soient pas aussi indépendantes de la plate-forme que l'on pourrait s'y attendre. $_SERVER['REQUEST_URI']semble être l'une de ces valeurs qui est définie de manière cohérente par tous les principaux serveurs Web, vous pouvez donc essayer de l'utiliser à la place.

Garrett
la source
Merci pour cela, mais je savais déjà que parfois cela est réglé, et parfois non. Ce que j'espérais, c'était un moyen d'influencer activement les variables définies pour ma configuration particulière, car je ne trouve aucune documentation sur les spécificités basées sur ma configuration (c'est-à-dire, comment je saurais avant la création d'un environnement).
Barry
0

Pour les images manquantes dans l'un de nos projets qui ont été redirigées vers index.php, je viens d'utiliser ce correctif:

url: http://www.domanXY.de/image.php?file=var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options=&options=resize_outer(320,150);sharpen(64) ;

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

Si vous voulez une solution globale, je pense que vous devez utiliser explode () etc et utiliser une autre variable donnée comme $ _SERVER ['REQUEST_URI'].

Logiciel Fusca
la source
-1

Vous pouvez définir un fichier de pré-ajout automatique php pour inclure un petit extrait de code PHP qui définit cette variable.

Jon Kloske
la source
Dans ma question, j'ai déjà identifié cela comme la ligne de conduite que je prendrais si ce n'était pas possible. C'est aussi ce que j'ai fini par faire, selon l'édition que j'ai faite avant que vous ne répondiez.
Barry
Toutes mes excuses, je ne me souviens pas avoir vu la modification avant de poster; il se peut que j'aie commencé à répondre avant de procéder à la modification, mais je ne suis pas sûr car la modification suivante a supprimé le tampon de date de modification d'origine: / J'aurais également dû préciser que ce que je proposais est probablement la bonne façon de réaliser ce que vous recherchez, plutôt qu'un "repli". Vous pouvez utiliser des drapeaux [E: blah = blah] pour les règles de réécriture pour définir des variables d'environnement arbitraires pour ensuite les récupérer dans le fichier de pré-inclusion, ce qui est plus propre que d'utiliser des variables GET pour passer des éléments du moteur de redirection à votre code.
Jon Kloske
Et par "probablement correct", je veux dire que c'est ainsi que j'ai fait cette chose exacte à plusieurs endroits dans le passé.
Jon Kloske