6 .htaccess Rewrites: Remove index.html, Remove .h

2020-07-22 09:51发布

问题:

i've to give some information about my website Environment

  1. i have static webpage in the root.

  2. Wordpress installed in sub-dictionary www.domain.com/blog/

  3. I have two .htaccess , one in the root and one in the wordpress folder.

i want to

  • www to non on all URLs < below code DID it :)
  • Remove index.html from url < below code DID it :)
  • Remove all .html extension / Re-direct 301 to url without .html extension < below code DID it :)
  • Add trailing slash to the static webpages / Re-direct 301 from non-trailing slash << I NEED HELP WITH THAT
  • Force trailing slash to the Wordpress Webpages / Re-direct 301 from non-trailing slash < below code DID it :)

Some examples

domain.tld/index.html >> domain.tld/

domain.tld/file.html >> domain.tld/file/

domain.tld/file.html/ >> domain.tld/file/

domain.tld/wordpress/post-name >> domain.tld/wordpress/post-name/

My code in ROOT htaccess is

    <IfModule mod_rewrite.c> 
    Options +FollowSymLinks -MultiViews


    RewriteEngine On 
    RewriteBase /

    #removing trailing slash
    RewriteCond %{REQUEST_FILENAME} !-d     
    RewriteRule ^(.*)/$ $1 [R=301,L]

    #www to non
    RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?domain\.com)$ [NC]
    RewriteRule .? http://%1%{REQUEST_URI} [R=301,L]

    #html
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^([^\.]+)$ $1.html [NC,L]

    #index redirect 
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/ 
    RewriteRule ^index\.html$ http://domain.com/ [R=301,L]
    RewriteCond %{THE_REQUEST} \.html 
    RewriteRule ^(.*)\.html$ /$1 [R=301,L] 
    </IfModule> 

    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /blog/
    # Force Trailing Slash for wordpress
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)[^/]{1}$ %{REQUEST_URI}/ [L,R=301]
    </IfModule> 

The above code do

  1. redirect www to non-www
  2. Remove trailing slash at the end (if exists)
  3. Remove index.html
  4. Remove all .html
  5. Redirect 301 to filename without trailing slash at the end
  6. Force Trailing Slash for wordpress and redirect 301 from non trailing slash at the end

EDIT

#removing trailing slash Rule usage

回答1:

Have it this way for site root .htaccess:

<IfModule mod_rewrite.c> 
Options +FollowSymLinks -MultiViews

RewriteEngine On 
RewriteBase /

#www to non
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?domain\.com)$ [NC]
RewriteRule ^(.+?)/?$ http://%1/$1/ [R=301,L]

RewriteCond %{THE_REQUEST} \s/+(.+?)\.html/?[\s?] [NC]
RewriteRule ^ /%1/ [R=301,NE,L]

#index redirect 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/ 
RewriteRule ^index\.html$ http://%{HTTP_HOST}/ [R=301,L]

# add a trailing slash to non files
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,R=301,NE]

# add html internally
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^.]+)/$ $1.html [L]

</IfModule>

Make sure to clear your browser cache before testing.



回答2:

RewriteEngine On 

RewriteBase /   

WWW to Non

RewriteCond %{HTTP_HOST} ^www.domain\.tld$ [NC]

RewriteRule ^(.*)$ http://domain.tld/$1 [L,R=301]

Remove index.html from url

RewriteRule ^index.html$ / [L,R=301]

Remove all .html extension / Re-direct 301 to url without .html extension

RewriteRule ^([a-zA-z0-9]+).html$ /$1   [L,R=301]

Add trailing slash to the static webpages / Re-direct 301 from non-trailing slash

RewriteRule ^([a-zA-z0-9]+).html$ /$1/   [L,R=301]

Force trailing slash to the Wordpress Webpages / Re-direct 301 from non-trailing slash

RewriteRule /blog/([^/]+) /blog/$1/ [L,R=301]