Sat vremena debugiranja, pet verzija .htaccess fajla, isto ponašanje svaki put. Problem koji sam sreo na projektu gdje su dva web sistema živjela na istom hostingu.

Situacija

Na mojadomena.ba živi portfolio sajt s vlastitim .htaccess koji sve šalje na index.php. U podmapi /podmapa/ živi drugi sistem s vlastitim routingom. Problem: root .htaccess ovim pravilom:

RewriteRule ^ index.php [L]

...hvata SVE URL-ove, uključujući /podmapa/tajniurl/login.php. Podmapni .htaccess nikad ne dobije šansu.

Rješenje — dva reda

U root .htaccess, odmah ispod RewriteEngine On:

RewriteCond %{REQUEST_URI} ^/podmapa
RewriteRule ^ - [L]

Ovo kaže: ako URL počinje s /podmapa — izađi iz ovog .htaccess odmah i prepusti podmapnom .htaccess da odradi posao.

Zašto AllowOverride ne pomaže

AllowOverride All dozvoljava podmapi da ima vlastiti .htaccess, ali ne može spriječiti root .htaccess da presretne zahtjev prije nego Apache uopće provjeri podmapni fajl. Redoslijed izvršavanja je fiksan: root uvijek prvi.

Debugging korak po korak

  1. Kreirajte /podmapa/test.php s <?php echo "radi"; ?>
  2. Otvorite direktno bez routinga. Ako radi — problem je u .htaccess, ne u fajlovima
  3. Dodajte RewriteEngine Off na vrh podmapnog .htaccess. Ako sad radi — vaša rewrite pravila su problem
  4. Ako ne radi ni s Off — root .htaccess presreće