开发者

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 redirec开发者_C百科t 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


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]


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.


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>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜