Marwen
Marwen

Reputation: 23

HTACCESS redirection with a word replacement in url

I'm having trouble with this reg expression which i belive is correct, but it is not working. What im trying to do is redirect bunch of urls containing a specific string like this:

http://www.example.com/**undesired-string**_another-string to http://www.example.com/**new-string**_another-string
and
http://www.example.com/folder/**undesired-string**/another-string to http://www.example.com/folder/**new-string**/another-string

So i have this code in the .htaccess:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule (.+)+(undesired-string)+(.+) $1new-string$2 [R=301,L]
</IfModule>

This should replace ANY undesired-string in any url to new-string, but it is not working, any idea why ?

Thank you

Upvotes: 2

Views: 10419

Answers (3)

Erhnam
Erhnam

Reputation: 921

To answer my own question. Laravel already redirects the trailing slashes. Problem was that Laravel was installed into a sub-directory. I added the location of the sub-directory to the redirect. My location in this case is: "/lumen/public/". See the fixed htaccess below.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /lumen/public/$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Upvotes: 0

CarpeNoctumDC
CarpeNoctumDC

Reputation: 1760

Marwen: Try this:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase / 

RewriteRule ^(.*)undesired-string(.*)$ yoursite.com/$1new-string$2 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^(.*)$ index.php?/$1 [L] 

RewriteCond %{HTTP_HOST} !^www.yoursite.com$ [NC] 
RewriteRule ^(.*)$ yoursite.com//$1 [L,R=301]
 </IfModule>

In your 'updated' code in the comments above, you had it applying the rewrite condition to the undesired-string... So if the actual file or directory was valid it would not rewrite...

Doing this though will always rewrite the undesired-string with new-string - even if its a file name... If that is fine or what you want then all you had to do was move your rewrite conditions to below the rewrite rule...

also.. Just an fyi.. If everything is on yoursite.com you dont need to list yoursite.com

i.e.

yoursite.com/$1new-string$2

just needs to be

/$1new-string$2

which does the same thing: rewrites to the base directory of yoursite.com

now if they are going from mysite.com to yoursite.com then you woulud want to include the domain name because you are redirecting across domain names


Edit: You may also want to use:

[QSA,L,R=301] 

instead of just [L,R=301]

Upvotes: 5

Floern
Floern

Reputation: 33904

Your regex is not really correct. Try:

RewriteRule ^(.*)undesired-string(.*)$ $1new-string$2 [R=301,L]

Or if this doesn't work, try:

RewriteRule ^(.*)undesired-string(.*)$ http://yoursite.com/$1new-string$2 [R=301,L]

Explanation: ^ marks the beginning; $ marks the end; the first (..) goes to $1, the second (..) goes to $2 and so on; * is 0 or more chars; + is 1 or more chars.

Upvotes: 3

Related Questions