2013-07-09 8 views
31

Próbuję ustawić zmienną środowiskową w pliku .htaccess i pobrać ją w PHP. Przejrzałem kilka innych wątków na SO, ale wszystko, co dotąd próbowałem, zawiodło.Ustaw zmienną środowiskową w .htaccess i pobierz ją w PHP

Dodałem tę linię do pliku .htaccess:

SetEnv SPECIAL_PATH /foo/bin 

próbowałem pobierania tej wartości za pomocą getenv() funkcji PHP:

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

Mam prowadzona phpinfo() aby zobaczyć listę dostępnych zmiennych środowiskowych, SPECIAL_PATH tam nie ma. Jestem zdziwiony, dlaczego to nie działa.

Dziękujemy!

+1

Czy na pewno pliki .htaccess są włączone dla tego konkretnego katalogu? spróbuj innej dyrektywy, której efekt można łatwo zweryfikować. – goat

+1

czy to inne pytanie z SO mogłoby ci pomóc? http://stackoverflow.com/questions/3780866/why-is-my-env-empty – luchosrock

Odpowiedz

23

Zakładając, że twoja konfiguracja ma AllowOverrides z .htaccess, musisz włączyć mod_env w Apache, aby to działało.

Apache - mod_env

+0

Zgaduję, że to jest problem. Próbuję dowiedzieć się, jak włączyć moduły Apache (jestem totalnym nowicjuszem z czymkolwiek związanym z serwerem), ale przynajmniej teraz wiem, gdzie szukać. Wielkie dzięki. –

+2

Gdziekolwiek znajduje się plik httpd.conf, który domyślnie jest typem "conf/httpd.conf" - poszukaj linii '#LoadModule env_module modules/mod_env.so' i usuń #, a następnie uruchom ponownie apache. –

6

Apache Docs zamówienie error.html obejmuje zmiennych środowiskowych przekazywanych do obsługi błędów strony

mówi „zmienne środowiskowe REDIRECT_ są tworzone ze zmiennych środowiskowych, które istniały przed przekierowaniem. Są one przemianowane z prefiks REDIRECT_, tj. HTTP_USER_AGENT staje się REDIRECT_HTTP_USER_AGENT. "

Mówi "Żadne z nich nie zostanie ustawione, jeśli docelowy obiekt ErrorDocument jest przekierowaniem zewnętrznym (cokolwiek zaczynającego się od nazwy schematu, np. Http :, nawet jeśli odnosi się do tego samego hosta, co serwer)."

Mówi o SetEnv: "Wewnętrzne zmienne środowiskowe ustawione przez tę dyrektywę są ustawione po uruchomieniu większości dyrektyw przetwarzania wczesnego żądania, takich jak kontrola dostępu i odwzorowywanie URI do nazwy pliku. jako wejście do tej wczesnej fazy przetwarzania, takiej jak dyrektywa RewriteRule, należy zamiast tego ustawić zmienną środowiskową za pomocą SetEnvIf. "

Na niektórych serwerach, zmienne środowiskowe zadeklarowane przez użytkownika musi zaczynać się od „HTTP_” dla celów bezpieczeństwa, np: SetEnv HTTP_MY_VARIABLE "my value"

Oto kilka .htaccess sposoby ustalania i za pomocą zmiennych środowiskowych serwera, zaczerpnięte z mojego modyfikując psujących się Prasa 5G Blacklist/Firewall http://perishablepress.com/5g-blacklist-2013/ użyć zmiennej środowiskowej sprawozdawczym:

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> 

Zauważ użycie paramters, np 0 USD -% 1 -% 2. % 0 daje pełny łańcuch,% 1 daje dopasowanie z 1. instrukcji nawiasów,% 2 drugiej. Łączniki są dosłownymi znakami, aby wizualnie oddzielić wyniki parametrów (nie myśl, że można w nich umieścić spacje).


Oto niektóre metody PHP dostępu do zmiennych środowiskowych (w moim przypadku z 403.php i 404.php). pamiętać, że nie patrzę w phpinfo(), ale w $ Server oraz, że zmienne się prefiksem przekierować Należy również zauważyć, że z 403/404 przekierowania, QUERY_STRING staje REDIRECT_QUERY_STRING To rzeczy, które mogłyby łatwo zależy od serwera, więc sprawdź wartość $ _SERVER dla rzeczywistych wartości.Na przykład,

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"); 
} 

omówię w pewnej głębokości w http://lcblog.lernerconsult.com/2013-server-alert-you-file-not-found-errors/

Powiązane problemy