Mam dosyć dziwny problem z zachowaniem .htaccess. Wpierw wprowadzenie:
1. Struktura katalogu:
Kod
\public
\private
.htaccess
index.php
\private
.htaccess
index.php
gdzie public jest katalogiem publicznym, private - katalog prywatny (całkowicie zabroniony dostęp przez przeglądarkę)
2. Plik .htaccess
Kod
RewriteEngine on
RewriteBase /test/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^(/public/)].*)$ index.php?q=$1 [QSA]
RewriteBase /test/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^(/public/)].*)$ index.php?q=$1 [QSA]
Jak widać wszystko co nie istnieje (poza katalogiem public) jest przekazywane w query stringu do pliku index.php.
Teraz zaczyna się problem:
- Dotychczas wszystko działało i nie zauważyłem problemów, aż nie zrobiłem przekierowania do login.html - adres: http://127.0.0.1/test/login.html
- Pojawił mi się błąd 404 (nie znaleziono obiektu).
- Aktualnie obojętnie co przekaże przez URI przechodzi do pliku index.php oprócz, UWAGA!: wszystkiego co zaczyna się na literę 'l' (małe L).
- Jeżeli przekaże LOGIN.html działa, jeżeli napiszę login, lizak, lubie, l*.html nie.
W tym momencie wymiękłem, innych plików .htaccess nie mam, w pliku konfiguracyjnym apache'a nic nie zauważyłem.
-------------------------------------------------
Mój błąd, i to poważny.
Rozwiązanie:
Bawiąc się odkryłem że nie mogą się zaczynać jeszcze na: u,i,o,p,u,b czyli public

Z tego co wyszperałem w htaccess nie może być takiego grupowania jak w regexp (w nawiasach okrągłych).
Kod
RewriteEngine on
RewriteBase /test/
RewriteRule ^public/(.*)$ /public/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#
#skasowano
#
#RewriteRule ^([^(/public/)].*)$ index.php?q=$1 [QSA]
#
# i dodano
#
RewriteRule ^(.*)$ index.php?q=$1 [QSA]
RewriteBase /test/
RewriteRule ^public/(.*)$ /public/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#
#skasowano
#
#RewriteRule ^([^(/public/)].*)$ index.php?q=$1 [QSA]
#
# i dodano
#
RewriteRule ^(.*)$ index.php?q=$1 [QSA]
Wymagane jest przekierowanie na public po to by wiedzieć że jakiś publiczny plik nie działa.
Moderatora proszę o zamknięcie.