2015-05-22 18 views
12

Mam zdefiniowany plik .htaccess na moją stronę internetową mającą ten kod:Jak zdefiniować zmienną w pliku .htaccess i używać jej?

RewriteEngine on 
RewriteBase/

RewriteRule ^bit_auth\/?(.*)$ /cig/base3/auth/$1 [R=301,NC,L] 
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes) 
RewriteRule ^(.*)$ /cig/base3/index.php/$1 [L] 

Chcę zachowywał moją ścieżkę katalogu głównego witryny w zmiennej jak ten:

RewriteEngine on 
RewriteBase/
SetEnv BASE_PATH "/cig/base3" 

RewriteRule ^bit_auth\/?(.*)$ %{ENV:BASE_PATH}/auth/$1 [R=301,NC,L] 
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes) 
RewriteRule ^(.*)$ %{ENV:BASE_PATH}/index.php/$1 [L] 

ponieważ może muszę Użyj wartości BASE_PATH w kolejnych kodach później, a także może zostać zmieniona i nie chcę wyszukiwać i zastępować za każdym razem w moim pliku htaccess. Ale kiedy użyć kodu powyżej, w pliku .htaccess %{ENV:BASE_PATH} zwraca pustą wartość niż oczekiwano /cig/base3 ale w php, gdy nazywam go za pomocą:

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

to pokazuje prawidłową wartość /cig/base3 .

Jaki jest problem w moich kodach i jak mogę to rozwiązać?

+2

Jest dziwactwo w kolejności, w której ładunki Apache/uruchamia moduły - mod_rewrite zawsze działa przed SetEnv, więc nie możesz użyć SetEnv do ustawienia zmiennej środowiskowej, której chcesz użyć w RewriteRiule; jednak ** możesz ** ustawić zmienną za pomocą RewriteRule; na przykład 'RewriteRule. * - [E = BASE_PATH:/cig/base3]' – CD001

+0

@ CD001 Nie bardzo rozumiem, dlaczego powinienem używać tego w ten sposób, ale kiedy wstawiłem twój kod do pliku htaccess, działa on zgodnie z oczekiwaniami. czy masz jakieś odniesienia do więcej opisu/szczegółów, a także przykłady dla doświadczonych użytkowników? lub opisz to jeszcze bardziej. –

Odpowiedz

8

Nie można w ten sposób użyć SetEnv, ponieważ nie jest jeszcze przetwarzany.

Wewnętrzne zmienne środowiskowe określone w niniejszej dyrektywie są ustawione po dyrektyw najbardziej wczesne przetwarzania żądania są prowadzone, takich jak dostęp kontroli i mapowania URI-do-pliku. Jeśli ustawiona zmienna środowiskowa ma na celu wprowadzenie do tej wczesnej fazy przetwarzania , na przykład dyrektywy RewriteRule, należy zamiast tego ustawić zmienną środowiskową za pomocą SetEnvIf.

Co szukasz jest setenvif zamiast SetEnv

więc powinieneś być w stanie zrobić coś takiego

SetEnvIf Request_URI "^.*" base_path=/cig/base3 

http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif

+1

^@ mrez.ir Oto, do czego doszedłem z moim komentarzem ... Jestem w pracy, więc nie mam czasu napisać w pełni sformatowanej spójnej odpowiedzi;) SetEnvIf (w przeciwieństwie do SetEnv) będzie działał przed mod_rewrite - ale możesz także ustawić zmienną środowiskową za pomocą samego mod_rewrite - albo działa. – CD001

+0

ale obie odpowiedzi są poprawne Nie mogę zrozumieć, dlaczego mam to zrobić w ten sposób? i który z nich jest bardziej poprawny? –

+1

@ mrez.ir - oba robią to samo, tylko na różne sposoby - tak czy inaczej, kończy się zestawem zmiennych środowiskowych. Wolę robić to przez RewriteRule, jeśli używam zmiennej z RewriteRules ... ale to naprawdę nie ma znaczenia. – CD001

Powiązane problemy