Sunday, May 1, 2011

.htaccess rewrite without www AND redirect to subdirectory

I'd like to redirect

  • www.example.com/* to example.com/*

And at the same time redirect

  • example.com/* to example.com/forum/*

But I also have /wiki/ and /blog/ and /style/, so I don't want to redirect

  • example.com/style/* to example.com/forum/style/*

This is what I have at the moment, which is not working quite correctly:

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/forum/
RewriteRule ^(.*)$ forum/$1 [R=301,L]

Clarification: my question can be asked in a simpler way.

I'd like to redirect an *empty REQUEST_URI* or /, or a non-existent file only if it is in the root directory to /forum/.

From stackoverflow
  • I'd say this should work.

    RewriteEngine on
    RewriteRule ^forum/(.*)$ forum/$1 [L]
    RewriteRule ^wiki/(.*)$ wiki/$1 [L]
    RewriteRule ^blog/(.*)$ blog/$1 [L]
    RewriteRule ^style/(.*)$ style/$1 [L]
    
    RewriteRule ^(.*)$ forum/$1 [L]
    
    RewriteCond  %{HTTP_HOST}  ^www.example\.com$
    RewriteRule ^(.*)$ http://example.com/$1
    
  • Try this:

    RewriteEngine On
    
    RewriteCond %{HTTP_HOST} ^example\.com
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,QSA,L]
    
    RewriteCond %{REQUEST_URI} !^/(wiki|blog|style|forum)
    RewriteRule ^(.*)$ http://www.example.com/forum/$1 [R=301,QSA,L]
    
  • I would use these rules:

    # redirect www.example.com to example.com
    RewriteCond %{HTTP_HOST} ^www\.example\.com$
    RewriteRule ^ http://example.com%{REQUEST_URI} [L,R=301]
    
    # prefix everything but /forum/, /wiki/, /blog/, /style/ with /forum/ and rediret to it
    RewriteRule !^(forum|wiki|blog|style)/ /forum%{REQUEST_URI} [L,R=301]
    

    The second rule could additionally be replaced by this one to check the existence of the first path segment for every request.

    # check if first segment of requested URI path is either missing
    RewriteCond $0 ^$ [OR]
    # or cannot be mapped to an existing directory
    RewriteCond %{DOCUMENT_ROOT}$0/ !-d
    RewriteRule ^[^/]* /forum%{REQUEST_URI} [L,R=301]
    

0 comments:

Post a Comment