Reputation: 155
All requests to my site should be rewritten to index.php?page=blah
, where blah is the page that's requested (except for css, js, jp(e)g, gif and png files).
This is how my .htaccess file looks like:
RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC]
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
The .htaccess is in this directory: localhost:8080/example/
, so when I go to localhost:8080/example/abc
, it is (internally) rewritten to localhost:8080/example/index.php?page=abc
.
However when I go to localhost:8080/example/res
, I get redirected to localhost:8080/example/res/?page=res
. I found out that this only happens to directories; when I go to localhost:8080/example/core
(also a folder on my file system), I get redirected to localhost:8080/example/core/?page=core
while it should be internally rewritten to localhost:8080/example/index.php?page=core
and the url visible to the user should stay localhost:8080/example/core/
EDIT:
Thanks to @w3dk, who solved the problem stated above. But I found another problem, which may be related to the problem above:
When I go to:
localhost:8080/example/index/a
, it's internally rewritten to localhost:8080/example/index.php?page=index.php/a
, while it should be rewritten to localhost:8080/example/index.php?page=index/a
.
I found out that this happens when index
is a file, cause when I go to localhost:8080/example/exampleFile/abc
, it's redirected to localhost:8080/example/index.php?page=exampleFile.php/abc
, which shouldn't be the case.
The 2 files in my directory are:
Apache seems to ignore the php file extension, cause this also works for exampleFile.txt
Upvotes: 6
Views: 2039
Reputation: 45829
This is probably happening because of a conflict with mod_dir. The default behaviour (DirectorySlash On
) is for mod_dir to automatically "fix" the URL when you request a physical directory without a trailing slash. It does this with an external 301 redirect, before your rule is processed. Your rule then fires, which modifies the target URL, a Location
header gets returned to the client and the browser redirects.
This won't happen if you include the trailing slash on the original request. eg. localhost:8080/example/core/
. mod_dir then does not need to "fix" the URL and issue a redirect. Although this may not be desirable for you?
Since you are wanting to internally rewrite all directories then the simple fix is to disable this behaviour in .htaccess
:
DirectorySlash Off
You will need to clear your browser cache before testing, as the earlier 301s by mod_dir will have been cached locally.
Reference (note the security warning):
https://httpd.apache.org/docs/current/mod/mod_dir.html#directoryslash
Upvotes: 2
Reputation: 80
You can use this .htaccess file Note: The directory folder1 must be unique in the URL. It won't work for http://domain.com/folder1/folder1.html. The directory folder1 must exist and have content in it.
RewriteEngine On
RewriteCond %{HTTP_HOST} domain.com$ [NC]
RewriteCond %{HTTP_HOST} !folder1
RewriteRule ^(.*)$ http://domain.com/folder1/$1 [R=301,L]
Upvotes: -1