Cosa fa RewriteBase e come usarlo?

Sto cercando di imparare alcuni trucchi .htaccess . Mi sono imbattuto nella direttiva RewriteBase ma non ho potuto farlo funzionare correttamente.

Mi chiedo cosa faccia specificamente questa direttiva e come usarla. Ci sono state alcune discussioni su RewriteBase in StackOverflow e la documentazione di Apache, ma ancora, non ho potuto ottenere una risposta chiara alla mia domanda.

Qualcuno potrebbe mostrarmi un esempio semplice ma efficace in cui RewriteBase ansible utilizzare RewriteBase ?

In un file htaccess, mod_rewrite funziona in modo simile a un contenitore o . e la RewriteBase viene utilizzata per fornire una base di percorso relativa.

Ad esempio, supponiamo di avere questa struttura di cartelle:

 root |-- subdir1 |-- subdir2 |-- subsubdir 

Quindi puoi accedere a:

  • http://example.com/ (root)
  • http://example.com/subdir1 (sottodir1)
  • http://example.com/subdir2 (subdir2)
  • http://example.com/subdir2/subsubdir (subsubdir)

L’URI che viene inviato attraverso un RewriteRule è relativo alla directory. Quindi se hai:

 RewriteRule ^(.*)$ - 

nella radice e la richiesta è /a/b/c/d , quindi l’URI catturato ( $1 ) è a/b/c/d . Ma se la regola è in subdir2 e la richiesta è /subdir2/e/f/g allora l’URI catturato è e/f/g . E se la regola è nel subsubdir , e la richiesta è /subdir2/subsubdir/x/y/z , allora l’URI catturato è x/y/z . La directory in cui si trova la regola ha quella parte rimossa dall’URI. La base di riscrittura non ha alcun effetto su questo, questo è semplicemente il modo in cui funziona la directory.

Ciò che fa la base di riscrittura, è fornire una base del percorso URL ( non una base del percorso file) per qualsiasi percorso relativo nella destinazione della regola. Quindi dì che hai questa regola:

 RewriteRule ^foo$ bar.php [L] 

Il bar.php è un percorso relativo, al contrario di:

 RewriteRule ^foo$ /bar.php [L] 

dove /bar.php è un percorso assoluto. Il percorso assoluto sarà sempre la “radice” (nella struttura delle directory sopra). Ciò significa che la regola è nella “root”, “subdir1”, “subsubdir”, ecc. Il percorso /bar.php si associa sempre a http://example.com/bar.php .

Ma l’altra regola, con il relativo percorso, si basa sulla directory in cui si trova la regola. Quindi se

 RewriteRule ^foo$ bar.php [L] 

è nella “radice” e vai a http://example.com/foo , ti viene servito http://example.com/bar.php . Ma se quella regola è nella directory “subdir1” e vai a http://example.com/subdir1/foo , ti viene servito http://example.com/subdir1/bar.php . ecc. Questo a volte funziona e talvolta no, come dice la documentazione, dovrebbe essere richiesto per i percorsi relativi, ma la maggior parte delle volte sembra funzionare. Tranne quando stai reindirizzando (usando la bandiera R , o implicitamente perché hai un http://host nella destinazione della regola). Ciò significa questa regola:

 RewriteRule ^foo$ bar.php [L,R] 

se è nella directory “subdir2” e vai a http://example.com/subdir2/foo , mod_rewrite scambierà il percorso relativo come percorso file invece di percorso URL e, a causa della bandiera R , tu finirà per essere reindirizzato a qualcosa di simile: http://example.com/var/www/localhost/htdocs/subdir1 . Che ovviamente non è quello che vuoi.

È qui RewriteBase entra in gioco RewriteBase . La direttiva dice a mod_rewrite cosa aggiungere all’inizio di ogni percorso relativo. Quindi se ho:

 RewriteBase /blah/ RewriteRule ^foo$ bar.php [L] 

e quella regola è in “subsubdir”, andando a http://example.com/subdir2/subsubdir/foo mi servirà in realtà http://example.com/blah/bar.php . Il “bar.php” viene aggiunto alla fine della base. In pratica, questo esempio non è solitamente quello che vuoi, perché non puoi avere basi multiple nello stesso contenitore di directory o nel file htaccess.

Nella maggior parte dei casi, è usato in questo modo:

 RewriteBase /subdir1/ RewriteRule ^foo$ bar.php [L] 

dove quelle regole sarebbero nella directory “subdir1” e

 RewriteBase /subdir2/subsubdir/ RewriteRule ^foo$ bar.php [L] 

sarebbe nella directory “subsubdir”.

Ciò consente in parte di rendere le tue regole portatili, in modo da poterle rilasciare in qualsiasi directory e solo modificare la base anziché un gruppo di regole. Ad esempio se tu avessi:

 RewriteEngine On RewriteRule ^foo$ /subdir1/bar.php [L] RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L] RewriteRule ^blah2$ /subdir1/blah2.php [L] ... 

in modo tale che andare su http://example.com/subdir1/foo serva http://example.com/subdir1/bar.php ecc. E dire che hai deciso di spostare tutti quei file e queste regole nella directory “subsubdir” . Invece di modificare ogni istanza di /subdir1/ a /subdir2/subsubdir/ , potresti avere solo una base:

 RewriteEngine On RewriteBase /subdir1/ RewriteRule ^foo$ bar.php [L] RewriteRule ^blah1$ blah.php?id=1 [L] RewriteRule ^blah2$ blah2.php [L] ... 

E poi quando hai avuto bisogno di spostare quei file e le regole in un’altra directory, cambia semplicemente la base:

 RewriteBase /subdir2/subsubdir/ 

e questo è tutto.

La risposta a 1 riga è: Rewritebase imposta il livello base di rewriterule arg2 .

Questo è letteralmente. (quindi funziona come html basehref, ⨕ eccetto che è utile poiché spesso nel contesto della riscrittura degli URL la base predefinita [ . ] non è desiderata.)

Rewritebase semplifica la manutenzione in caso di più rewriter. In effetti, se si utilizza solo una riga di rewriterule, rewritebase è praticamente inutile (come si può semplicemente riscrivere l’url basato).


Nota a margine

Ovviamente, è ansible ignorare completamente rewritebase, utilizzando solo percorsi assoluti per i rewriter.


Relazionato

  • un uso rewritebase non progettato [casuale]