Un fișier .htaccess cu reguli de rescriere pentru toate domeniile (Webmasteri, Htaccess, Mod Rewrite, Rescriere Url)

Harry Muscle a intrebat.

Serverul nostru este configurat cu mai multe domenii care locuiesc în subfolderele din fișierul public_html dosar. Astfel, domain1.com se află în /home/user/public_html/domain1.com și domain2.com este localizat în /home/user/public_html/domain2.com și așa mai departe.

Am plasat un .htaccess în /home/user/public_html astfel încât să pot pune în el setări care să se aplice tuturor domeniilor. Am adăugat două lucruri la acesta .htaccess fișier. Unul este o variabilă de mediu specială care este recunoscută de PHP foarte bine. Celălalt este o redirecționare pentru orice dosar numit .svn către un fișier numit non-existent. Deci, fișierul meu .htaccess arată astfel:

RewriteEngine on
RewriteRule /.svn /non-existant
SetEnv ENVIRONMENT PRODUCTION

Problema este că regula de rescriere nu funcționează deloc. Variabila de mediu funcționează, deci știu că acest fișier este procesat de Apache, dar regula de rescriere nu funcționează. Am încercat alte câteva reguli de rescriere și niciuna nu pare să funcționeze.

Regulile de rescriere funcționează doar dacă se află în document_root?

3 răspunsuri
Dan

Nu potrivești corect folderul .svn:

RewriteEngine on
RewriteRule  ^(.*/)*.svn/ /non-existant

Eu aș redirecționa de fapt ca un 403 Forbidden:

RewriteRule  ^(.*/)*.svn/ /non-existant [F,L]

Comentarii

  • „redirect as a 403 Forbidden” – partea asta nu prea are sens, vrei să spui serve un 403 Forbidden. Nu există o „redirecționare” ca atare. Atunci când se specifică F, , se va folosi RewriteRule substituție (de ex. /non-existent) este ignorată complet, iar Apache returnează documentul 403. –  > Por MrWhite.
Stephen Ostermiller

Apache caută doar .htaccess fișiere în interiorul rădăcinii documentului. Se pare că aveți mai multe rădăcini de documente – una pentru fiecare domeniu. Singurul loc în care ați putea pune o regulă de rescriere centrală pentru toate acestea ar fi în Apache’s httpd.conf de la Apache.

Comentarii

  • Apache se va uita până la / dacă AllowOverride este setat în acest fel. Consultați httpd.apache.org/docs/trunk/howto/htaccess.html –  > Por Dan.
  • Se pare că se așteptau ca un fișier .htaccess din afara rădăcinii documentului să aibă efect. –  > Por Stephen Ostermiller.
  • Fișierele .htaccess pot exista deasupra rădăcinii documentului. Faptul că var-ul de mediu a fost setat dovedește că a fost apelat. –  > Por Dan.
  • Bună observație în privința variabilei de mediu.  > Por Stephen Ostermiller.
MrWhite

Dacă aveți un .htaccess fișiere într-un subdirectoriu (de ex. /public_html/domain2.com/.htaccess) care conține directive mod_rewrite (chiar și doar RewriteEngine), atunci directivele mod_rewrite din directorul părinte .htaccess va fi complet anulată și nu se va executa. Acesta este comportamentul implicit. directivele mod_rewrite nu sunt moștenite în mod implicit (într-un fișier director/.htaccess context).

Cu toate acestea, puteți trece peste acest lucru declarând în mod explicit RewriteOptions inherit (există și alte opțiuni pe Apache 2.4+) în fișierul copil .htaccess fișier copil. Cu toate acestea, rețineți că directivele mod_rewrite părinte sunt literalmente copiate pe loc în fișierul copil .htaccess (ceea ce modifică în mod natural prefixul de director – care ar putea fi fi o problemă în funcție de directivă).

Pe Apache 2.4+ puteți moșteni în alt mod, adică de la părinte la copil, mai degrabă decât de la copil la părinte (ceea ce este mult mai convenabil în acest caz). Așadar, în fișierul părinte .htaccess (în fișierul /public_html), puteți preciza:

RewriteOptions InheritDownBefore

Ceea ce va permite ca directivele mod_rewrite părinte să fie moștenite de toate configurațiile copil și care va executa înainte de configurația copil.

Doar pentru a sublinia, acest lucru se referă doar la mod_rewrite. Alte module moștenesc în mod implicit. Fiecare modul Apache este procesat independent.

Referință:
https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriteoptions