Am un server local Apache pentru dezvoltarea paginilor. Prin urmare, am un folder rădăcină în care toate paginile diferite sunt în subdosare. Aceste foldere au apoi alte subdosare pentru conținutul public. Acesta poate fi - în funcție de cadru - un folder diferit (de exemplu, public, wwwroot, webroot, httpdocs).
Structura folderului:
/
|-- srv
|-- http
|-- pagina
| |-- webroot
| |-- .htaccess
| |-- index.php
|-- pagina 2
|-- public
|-- index.php
Acum, în loc să folosesc http://localhost/page/webroot, vreau să folosesc http://page.localhost/ Schema URL, deoarece ar trebui să fie ca în lumea reală (de exemplu, link-urile care indică rădăcină ar trebui să funcționeze și așa mai departe).
Mai întâi am încercat cu VirtualDocumentRoot /srv/http/%-2/webroot/
care pare să funcționeze destul de bine dacă toate paginile au folderul webroot ca dosar public. Cu toate acestea, nu funcționează dacă folderul public are un alt nume.
Deci, a doua mea abordare a fost să folosesc mod_rewrite. cu ceva de genul:
DocumentRoot /srv/http
RewriteEngine Pornit
RewriteCond %{HTTP_HOST} (.+)\.[^\.]+$
RewriteCond %{DOCUMENT_ROOT}/%1/webroot -d
RewriteRule ^(.+) %{DOCUMENT_ROOT}/%1/webroot/$1 [L]
(Ultimele 3 rânduri pot fi repetate pentru celelalte foldere - omis aici pentru lizibilitate)
A părut destul de promițător la început, dar apoi am aflat că nu funcționează dacă pagina are un fișier .htaccess cu mod_rewrite local care mapează toate cererile la index.php (cum fac unele cadre). În acest caz, mod_rewrite va rula într-o buclă nesfârșită, deoarece partea dinamică a căii este tratată ca un subfolder și nu ca DocumentRoot. Iată rezultatul din jurnal:
https://pastebin.com/4aNgRahx
Acest lucru se repetă până când se atinge limita recursiunii.
Fișierul .htaccess arată astfel:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^ index.php [L]
</IfModule>
Dacă îl opresc, va funcționa.
Deci ce ar trebui să fac acum?
Schimbarea fișierului .htaccess sau a oricăror fișiere din folderul proiectului nu este o opțiune, deoarece atunci nu va mai funcționa pe serverul real.