Search code examples
php.htaccesshttpsno-www

htaccess 404 error on language subfolder (en/)


I have the following structure:

/  
/about.php  
/contact.php  
/en/  
/en/about.php  
/en/contact.php  

And I want to remove .php extension and www prefix from the urls and force https as well.

Now I have the following htaccess:

RewriteEngine On  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteRule ^([^/]+)/$ $1.php  
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$  
RewriteRule (.*)$ /$1/ [R=301,L]  

Thanks in advance for any help!


Solution

  • You're really close as far as what you have. Now that I know the issue I'll give you what I use -- You need a condition that says is not a directory -- And the syntax is !-d

    This is how my htaccess looks (because I use it to remove html as well as php:

    RewriteEngine on 
    
    # Redirect www and http to https - non-www
       RewriteCond %{HTTPS} off [OR]
       RewriteCond %{HTTP_HOST} ^www\. [NC]
       RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
       RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
    
    # Start php extension remove
       RewriteCond %{REQUEST_FILENAME} !-d 
       RewriteCond %{REQUEST_FILENAME}\.php -f 
       RewriteRule ^(.*)$ $1.php
    # End php extension remove    
    
    # Start html extension remove
       RewriteCond %{REQUEST_FILENAME} !-d 
       RewriteCond %{REQUEST_FILENAME}\.html -f 
       RewriteRule ^(.*)$ $1.html
    # End html extension remove
    

    As you can see the first condition checks to see that it's not a directory. The following condition checks to see if it's file extension is .php. If both conditions are true -- The rule is to remove the extension.

    As a note -- I would make your syntax a little cleaner and separate the "sections" of what you are trying to do.

    UPDATE AS PER COMMENT

    To remove the https forcing -- Simply comment out the first condition and change https to http in the rule:

    RewriteEngine on 
    
    # Redirect www and http to https - non-www
       #RewriteCond %{HTTPS} off [OR]
       RewriteCond %{HTTP_HOST} ^www\. [NC]
       RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
       RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
    
    # Start php extension remove
       RewriteCond %{REQUEST_FILENAME} !-d 
       RewriteCond %{REQUEST_FILENAME}\.php -f 
       RewriteRule ^(.*)$ $1.php
    # End php extension remove    
    
    # Start html extension remove
       RewriteCond %{REQUEST_FILENAME} !-d 
       RewriteCond %{REQUEST_FILENAME}\.html -f 
       RewriteRule ^(.*)$ $1.html
    # End html extension remove