2015-05-22 15 views
12

ho definito un file .htaccess per il mio sito web di avere questo codice:come posso definire la variabile nel file .htaccess e usarla?

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] 

voglio mantenere il mio percorso principale del sito in una variabile come questo:

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] 

perché posso avere bisogno di utilizzare il valore BASE_PATH in altri codici più tardi e potrebbe anche essere cambiato e non voglio cercare e sostituire ogni volta nel mio file htaccess. Ma quando uso codice di cui sopra, nel file .htaccess %{ENV:BASE_PATH} restituisce un valore vuoto invece del previsto /cig/base3 ma in php, quando lo chiamo io utilizzando:

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

sta mostrando il valore corretto di /cig/base3 .

Qual è il problema nei miei codici e come posso risolvere questo?

+2

C'è una stranezza nell'ordine in cui i carichi Apache/esegue i moduli - mod_rewrite viene sempre eseguito prima di SetEnv, quindi non è possibile utilizzare SetEnv per impostare una variabile di ambiente che si desidera utilizzare in una RewriteRiule; tuttavia ** puoi ** impostare la variabile con una RewriteRule; per esempio. 'RewriteRule. * - [E = BASE_PATH:/cig/base3]' – CD001

+0

@ CD001 Non ho capito esattamente perché dovrei usarlo in questo modo ma quando ho inserito il tuo codice nel mio file htaccess funziona come previsto. avete riferimenti per ulteriori descrizioni/dettagli e anche esempi per utenti non esperti? o per favore descrivilo di più –

risposta

8

Non è possibile utilizzare SetEnv in questo modo perché non è ancora stato elaborato.

Le variabili d'ambiente interne stabilite dalla presente direttiva sono impostati dopo direttive più presto richiesta di elaborazione vengono eseguiti, come l'accesso il controllo e la mappatura URI-to-file. Se la variabile di ambiente impostata come input in questa fase iniziale dell'elaborazione di come la direttiva RewriteRule, è necessario impostare la variabile di ambiente con SetEnvIf.

Quello che state cercando è setenvif invece di SetEnv

Così si dovrebbe essere in grado di fare qualcosa del genere

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

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

+1

^@ mrez.ir Questo è quello che stavo ottenendo con il mio commento ... Sono al lavoro quindi non ho avuto il tempo di scrivere una risposta coerente completamente formattata;) SetEnvIf (a differenza di SetEnv) verrà eseguito prima di mod_rewrite - ma puoi anche impostare la variabile di ambiente con mod_rewrite stesso - o funziona. – CD001

+0

ma entrambe le risposte sono corrette Non riesco a capire perché dovrei farlo in questi modi? e quale è più corretto? –

+1

@ mrez.ir - entrambi fanno la stessa cosa, solo in modi diversi - in entrambi i casi, si finisce con un set di variabili d'ambiente. Preferisco farlo attraverso un RewriteRule se sto usando la variabile con RewriteRules ... ma in realtà non importa. – CD001

Problemi correlati