I am trying to work on my \"pretty-urls\" and I\'ll be the first to admit I really don\'t know what I\'m doing. I\'m trying to wrap my head around it though. So what I am trying
This is because of mod-dir
Apache directory module that runs before mod-rewrite
. When you request an existent directory without a traling slash the mod-dir
issues a permanent 301 Redirect from /dir
to /dir/
and that is why you are unable to rewrite the uri.
To fix this, you need to tell mod-dir not to perform the redirection when a directory without a traling slash is requested. You can use DirectorySlash
directive in your htaccess to change this behaviour.
Add the following line to your htaccess :
DirectorySlash off
Reference : https://httpd.apache.org/docs/2.4/mod/mod_dir.html
Have it this way:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^dire1/file/([0-9]+) dir1/file.php?id=$1 [NC,QSA,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^dir2/example/([0-9]+) dir2/example.php?id=$1 [NC,QSA,L]
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
Last rule will serve /file.php
when URI is example.com/file/
Note that if you serve example.com/file
(no trailing slash) then Apache's mod_dir
module will add a trailing slash in the end to make it example.com/file/
and then server /file.php
.
Turning off this trailing slash behavior is considered a security risk and it may expose your internal directory structure to your visitors.