Search code examples
apache.htaccessmod-rewriteurl-rewriting

Remove the subfolder from the url path, given that there is no slash at the end


I have the htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /pages/$1 [L]

it removes /pages/ from the url to the pages

but when i open link without the slash at the end:

site.com/contacts

it is redirected to

site.com/pages/contacts/

Is there a way to fix this?


I've tried different results, most often other options cause a redirect to site.com/index.php ( site.com/pages/index.php)


Solution

  • It is happening because pages/contacts is a directory and Apache mod_dir module is adding a trailing slash after request to a directory.

    You can check for directory presence and add a trailing / via a rule before rewrite to pages/:

    RewriteEngine On
    
    # add a trailing slash if pages/$1 is a directory
    RewriteCond %{DOCUMENT_ROOT}/pages/$1 -d
    RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,R=301,NE]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /pages/$1 [L]
    

    Make sure to use a different browser or remove cache data from your browser to test this rule to avoid old cache.