.htaccess in root and subfolder, each to redirect to own index.php
Solution 1
Have your root .htaccess like this:
Options -Indexes -MultiViews +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?!admin/)(.+)$ /index.php?u=$1 [NC,QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.+)$ /admin/index.php?u=$1 [NC,QSA,L]
There is no need to have .htaccess in admin folder for this simple requirement.
Solution 2
This line of the root folder .htaccess:
RewriteRule ^(.*)$ /index.php?u=$1 [NC,QSA]
is causing all the requests to non-existent filepaths to be redirected to the root folder's index.php
. That's the problem.
One possible solution could be to substitute the above line with this couple of lines:
RewriteRule ^subfolder/(.*)$ /subfolder/index.php?u=$1 [L,NC,QSA]
RewriteRule ^(.+)$ /index.php?u=$1 [L,NC,QSA]
By adding the L
(last) flag and writing the rules in this order you'll get Apache to redirect correctly your requests, and eliminate the need for rewriting directives into /subfolder/.htaccess
.
Related videos on Youtube
jezmck
Updated on November 03, 2020Comments
-
jezmck over 3 years
I apologise for a seemingly duplicate question, but none of the dozens I've looked at actually had the same problem.
I have the following directory structure:
/.htaccess /index.php /subfolder/.htaccess /subfolder/index.php
I'd like all requests for pages to be handled by
/index.php
, unless the request starts/subfolder
in which case it should be handled by/subfolder/index.php
- e.g.
/abc
to be rewritten to/index.php?u=abc
- e.g.
/subfolder/def
to be rewritten to/subfolder/index.php?u=def
I've been going round in circles over this, so any help will be massively appreciated.
EDIT: forgot to mention the problem! Requests within the subfolder are handled by the root
index.php
, not the subfolder one. (Except requests for/subfolder
)Current File contents
/.htaccess
Options -Indexes -MultiViews +FollowSymLinks RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/admin RewriteRule ^(.*)$ /index.php?u=$1 [NC,QSA]
/subfolder/.htaccess
RewriteBase /admin/ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /admin/index.php?u=$1 [NC,QSA]
- e.g.
-
jezmck almost 13 yearsI tried similar at one point. Wouldn't that [L] make it a redirect?
-
Paolo Stefan almost 13 years@jezmck No, that is done by the [R] flag. [L] causes the rewriting to be stopped from further rules application.
-
jezmck almost 13 yearsstackoverflow.com/questions/3482106/… explains what I meant by that.
-
Smith over 6 years@anubhava this does not work when WordPress is the main site and CodeIgniter is in
subfolder
, what could be the reason. see here stackoverflow.com/questions/47467868/… -
anubhava over 6 yearsMost of the
mod_rewrite
rules don't work with PHP frameworks with a front controller architecture like WP, Joomla, CI etc. Better to use framework provided APIs for rewriting stuff instead ofmod_rewrite
.