Puncte:1

Apache 2.4 Convertiți .htaccess și rescrieți-l în vhost.conf

drapel pl

Rescriu configurația Apache 2.4 pe care am primit-o de la vechea echipă de dezvoltare.

Am ~ 200 de linii de configurație similară și nu pot înțelege pe ce principiu trebuie să schimb acest cod pentru a-l muta de la .htaccess la virtualhost.

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
RewriteRule ^(.*)$ /$1/ [R,L,NC]

Când îl mut pe virtualhost, site-ul meu se blochează în locuri pe care nu le înțeleg.

Chris avatar
drapel it
În .htaccess, regulile de rescriere se aplică directorului în care se află .htaccess. În virtualhost, trebuie să setați aceste reguli într-un sau bloc.
drapel pl
Mulțumiri! Am încercat să o fac în acest fel, dar se pare că regulile trebuie schimbate cumva. Înțeleg, de asemenea, că căile fișierelor trebuie remediate, dar expresiile regulate mă înnebunesc.
Puncte:0
drapel kz

Depinde unde în <VirtualHost> container pe care plasați aceste directive.

Dacă utilizați un <Directory> container (adică a director context) și dezactivarea .htaccess anulează cu totul (în caz contrar .htaccess va trece peste <Directory> container!), atunci puteți copia aproape directivele așa cum sunt (presupunând că <Directory> container face referire la același director ca și .htaccess dosarul a făcut).

Cu toate acestea, dacă introduceți aceste directive direct în interiorul <VirtualHost> container (în afara unui <Directory> container), adică. într-o virtualhost context, atunci trebuie să faceți unele modificări. Acest lucru se datorează faptului că directivele sunt procesate mai devreme, înainte ca cererea să fie mapată la sistemul de fișiere.

În directivele pe care le-ați postat, ar fi necesare doar două modificări:

  • Într-o virtualhost contextul, REQUEST_FILENAME variabila server nu a fost încă rezolvată la a nume de fișier. Este la fel ca REQUEST_URI (adică adresa URL care este solicitată). Deci, verificarea sistemului de fișiere va eșua întotdeauna și condiția va avea întotdeauna succes! Fie trebuie să folosiți o privire înainte. de exemplu. %{LA-U:REQUEST_FILENAME}, sau construiți singur numele absolut de fișier. de exemplu. %{DOCUMENT_ROOT}%{REQUEST_URI}. De exemplu:

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    
  • Într-o virtualhost context, calea URL care este potrivită de RewriteRule model este relativ la rădăcină (începând cu o bară oblică). întrucât în .htaccess este relativ la directorul care conține .htaccess fișier - mai puțin prefixul barei oblice. Deci, regula așa cum este scrisă ar avea ca rezultat o dublă bară oblică la începutul căii URL, ar trebui rescrisă astfel:

    RewriteRule ^/(.*)$ /$1/ [R,L]
    

    (Cel NC steag nu este necesar aici.)

    Sau (de preferință) nu utilizați o referință în spate aici și utilizați REQUEST_URI variabilă server în schimb (care ar funcționa în mod natural în .htaccess de asemenea). De exemplu:

    RewriteRule ^ %{REQUEST_URI}/ [R,L]
    

    (Deoparte: Probabil că aceasta ar trebui să fie și o redirecționare permanentă 301 (de ex. R=301). În starea actuală, aceasta va fi implicită la o redirecționare temporară 302. Dar schimbați la un 301 - dacă aceasta este intenția - după ce ați confirmat că funcționează conform intenției.)

Deci, pe scurt, acesta ar deveni:

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
RewriteRule ^/(.*)$ /$1/ [R,L]

Deoparte:

Cele de mai sus pot fi optimizate imediat un pic prin mutarea verificării sistemului de fișiere (care este relativ scump) la ultima condiție și mutarea condiție care verifică dacă cererea nu se termină deja într-o bară oblică RewriteRule directivă. De asemenea, subpatternele regex (.*) în fiecare dintre conditii nu sunt necesare. Deci, cele de mai sus ar putea fi rescrise mai eficient:

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} !^/application-module/
RewriteCond %{REQUEST_URI} !json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/ [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule !/$ %{REQUEST_URI}/ [R,L]

Verificarea sistemului de fișiere poate fi eliminată cu totul dacă, în schimb, excludeți cererile care conțin (așa cum arată) o extensie de fișier, dar aceasta poate depinde de structura fișierului dumneavoastră.

The condiție care verifică !json$ se pare că ar trebui să verifice .json extensia de fișier, de ex. !\.json$. (Acest lucru se leagă de comentariul meu de mai sus despre excludere toate cereri care au o „extensie de fișier”.)

Primul condiție care verifică dacă șirul de interogare este gol pare puțin ciudat (din moment ce nu contează dacă există sau nu un șir de interogare atunci când adăugați o bară oblică la calea URL), dar presupun că aceasta trebuie să fie o cerință specifică?

drapel pl
asta e grozav! totul are sens, iar acum totul funcționează! Multumesc de multe ori!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.