web-dev-qa-db-fra.com

Définissez une variable d'environnement dans .htaccess et récupérez-la dans PHP

J'essaie de définir une variable d'environnement dans un fichier .htaccess et de la récupérer en PHP. J'ai parcouru un tas d'autres discussions ici sur SO mais tout ce que j'ai essayé jusqu'à présent a échoué.

J'ai ajouté cette ligne au fichier .htaccess:

SetEnv SPECIAL_PATH /foo/bin

J'ai essayé de récupérer cette valeur en utilisant la fonction getenv () PHP:

<?php $specialPath = getenv('SPECIAL_PATH'); ?>

J'ai exécuté phpinfo () pour voir la liste des variables d'environnement disponibles, SPECIAL_PATH n'est pas là. Je suis perplexe quant à la raison pour laquelle cela ne fonctionne pas.

Merci!

41
Bruno Cloutier

En supposant que votre configuration possède AllowOverrides avec .htaccess, vous devez activer mod_env dans Apache pour que cela fonctionne.

Apache - mod_env

30
Jacob S

Apache Docs custom-error.html couvre les variables d'environnement transmises aux pages de gestion des erreurs

Dit "Les variables d'environnement REDIRECT_ sont créées à partir des variables d'environnement qui existaient avant la redirection. Elles sont renommées avec un préfixe REDIRECT_, c'est-à-dire HTTP_USER_AGENT devient REDIRECT_HTTP_USER_AGENT. "

Dit "Aucun de ceux-ci ne sera défini si la cible ErrorDocument est une redirection externe (tout ce qui commence par un nom de schéma comme http :, même s'il fait référence au même hôte que le serveur)."

Dit à propos de SetEnv: "Les variables d'environnement internes définies par cette directive sont définies après l'exécution de la plupart des premières directives de traitement des demandes, telles que le contrôle d'accès et le mappage d'URI en nom de fichier. Si la variable d'environnement que vous définissez est destinée à être entrée dans ce première phase de traitement telle que la directive RewriteRule, vous devez plutôt définir la variable d'environnement avec SetEnvIf. "

Sur certains serveurs, les variables d'environnement déclarées par l'utilisateur doivent commencer par 'HTTP_' pour des raisons de sécurité, par exemple: SetEnv HTTP_MY_VARIABLE "my value"

Voici quelques façons .htaccess de définir et d'utiliser des variables d'environnement de serveur, tirées de ma modification de la liste noire/pare-feu de Perishable Press 5G http://perishablepress.com/5g-blacklist-2013/ pour utiliser la variable d'environnement rapports:

SetEnv myServerName %{SERVER_NAME}

RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig|open_basedir) [NC,OR]
RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR]
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC]
RewriteRule .* - [E=badQueryString:%0--%1--%2,F,L]

SetEnvIfNoCase User-Agent ^$ noUserAgent
SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) badUserAgent=$1

<limit GET POST PUT>
  Order Allow,Deny
  Allow from all
  Deny from env=badUserAgent
</limit>

Remarquez l'utilisation de paramètres, par ex. 0 $ -% 1 -% 2. % 0 donne la chaîne complète,% 1 donne la correspondance de la 1ère instruction entre parenthèses,% 2 la 2ème. Les tirets sont des caractères d'affichage littéraux, pour séparer visuellement les résultats des paramètres (ne pensez pas qu'il existe un moyen d'y mettre des espaces).


Voici quelques méthodes PHP d'accès aux variables d'environnement (dans mon cas de 403.php et 404.php). Notez que vous ne regardez pas dans phpinfo (), mais dans $ SERVER, et que vos variables soient préfixées avec REDIRECT Notez également qu'avec une redirection 403/404, le QUERY_STRING devient REDIRECT_QUERY_STRING. Ce sont des choses qui pourraient facilement dépendre du serveur, vérifiez donc $ _SERVER pour vos valeurs réelles. Par exemple,

if (getenv("HTTP_REFERER") !== FALSE) {
    $httpref = getenv("HTTP_REFERER");
} else {
    $httpref = '';
}
if (isset($_SERVER['REDIRECT_STATUS'])) {
    $status = $_SERVER['REDIRECT_STATUS'];
} else {
    $status = '';
}
if (isset($_SERVER['REMOTE_Host'])) {
    $remoteHost = $_SERVER['REMOTE_Host'];
} else {
    $remoteHost = '';
}

if (isset($_SERVER['REDIRECT_QUERY_STRING'])) {
    $querystring = $_SERVER['REDIRECT_QUERY_STRING'];
} else {
    $querystring = '';
}

if (isset($_SERVER['REDIRECT_noUserAgent']) ) {
    $htaccessErrors[] = 'NoUserAgent';
}
if (getenv("REDIRECT_badQueryString") !== FALSE) {
/* must exactly match what shows up in $_SERVER, is case sensitive (e.g. badQueryString not BadQueryString) */
    $htaccessErrors[] = 'badQueryString:'.getenv("REDIRECT_badQueryString");
}

Je couvre en profondeur dans http://lcblog.lernerconsult.com/2013-server-alert-you-file-not-found-errors/

8
George Lerner