How to use htaccess to point to a different directory?

htaccess multi-domain redirect issues

  • I have .htaccess rewrite/redirect problems. What makes this more frustrating is that it is such a simple situation. I am doing a favour for a friend, the kind of favour that you soon wish you'd never got involved with and left for a professional to sort out. But I'm a nice person, so I get to spend my weekend gnawing my own arms off in anger at how out of my depth I am. I have a multilingual CMS site (English, French, Russian) and I am attempting to have a separate domain for each language, even though all the content is on the same server. A CMS plugin handles the multilingual stuff - each page has English content, French content and Russian content, but when the page is compiled for display (it's a php/MySQL driven database) only the active language is displayed. So mysite.com/en/ is the English version of the homepage, mysite.com/fr/ is the French and mysite.com/ru/ is the Russian. Even though the /en/ folders etc. don't actually exist - they're just aliases for mysite.com/index.php?lang=en or some such thing. I'd assumed that this was an htaccess thing, so expected to see a corresponding Rewrite rule in the existing htaccess, but there isn't one, so I don't know exactly how the alias is happening. That might not be important - what is important is that foo/en/bar is the English version of foo/fr/bar etc, and that the /lang/ bit is not a real directory. I have three domains: myenglishsite.com, myfrenchsite.com and myrussiansite.com. They are all parked at the same IP address, so that myenglishsite.com is exactly equivalent to myrussiansite.com. Here's what I want to happen: - I want myenglishsite.com to automatically redirect to myenglishsite.com/en/ - I want myfrenchsite.com to automatically redirect to myfrenchsite.com/fr/ - I want myrussiansite.com to automatically redirect to myrussiansite.com/ru/ but - and here's the pain in the ass - I need myenglishsite.com/admin/ to stay as it is, not to have /en/ inserted rudely into its middle, because myenglishsite.com/en/admin is not a valid address and I'll never be able to log in to the site's admin area. And obviously address that already have language information need to stay untouched, otherwise typing myrussiansite.com/ru/page/sub-page/ into the browser will result in myrussiansite.com/ru/ru/page/sub-page/ being output, which will give an error. Every .htaccess rule I've tried so far has either resulted in a 500 Internal Server Error, or /lang/ being inserted into every address, or some other weird thing where the CSS is no longer loaded and images can't be found, or nothing at all. What I want to say, in plain English is this: Redirect the root domain myenglishsite.com/ to myenglishsite.com/en/ but if the address has anything beyond the root domain, i.e. we're looking for myenglishsite.com/* then take no action, regardless of what * is. This next bit of code, for instance: RewriteCond %{HTTP_HOST} myenglishsite.com RewriteCond %{REQUEST_URI} !^/en RewriteRule ^(.*)$ en/$1 [R,L] results in /en/ successfully being appended to the domain, but it's too successful, because every single instance of myenglishsite.com/x/ where x is NOT /en/ gets one. So the stylesheet can't be found, because myenglishsite.com/en/style/style.css is not the correct address. what I want is the ^(.*)$ bit [as I understand it, this means 'any number of characters'] to say myenglishsite.com/?$ (i.e. myenglishsite.com with or without trailing slash, and nothing else after it). But if I put that in the htaccess, nothing whatsoever appears to happen and myenglishsite.com does not forward to myenglishsite.com/en/ Failing this, how else can I get the three root domains to point to the correct languages? I should add that the language suffix is more important than the domain, so myrussiansite.com/fr/ should be in French (going back to what I said about 'take no action in the case of domain.com/* where * is something') Can anyone help? Please?

  • Answer:

    If you just want to match the root only, then you want RewriteRule ^$ en/ [R]. You don't even need the RewriteCond checking for /en because such a RewriteCond would never match that anyway.

The Discredited Ape at Ask.Metafilter.Com Visit the source

Was this solution helpful to you?

Other answers

mod_rewrite is great, but in this case I think it is a little overkill. You just want to do a redirection for the index page, so create an index.php with this:<?php$lang = 'en/'; # defaultif ($_SERVER['HTTP_HOST'] == 'myfrenchsite.com') { $lang = 'fr/';} elseif ($_SERVER['HTTP_HOST'] == 'myrussiansite.com') { $lang = 'ru/';} # etc...header( sprintf( "Location: http://%s/%s", $_SERVER['HTTP_HOST'], $lang ), true, 302 );?>

sbutler

Or, if you're really hell bent on using mod_rewrite, a RewriteRule like this should work (although sometimes I get confused about when a subreq happens to add a trailing /)# If you're doing this in an .htaccess file you need RewriteBaseRewriteBase /# Some RewriteCond statements...RewriteRule ^/?$ /en/ [R,L]Note that RewriteRule doesn't match against the whole URL, just the path part. And inside an .htaccess, I believe the beginning '/' is always stripped.

sbutler

I love you both so much I could weep. Huge, heaving sobs of joy.

The Discredited Ape

Just Added Q & A:

Find solution

For every problem there is a solution! Proved by Solucija.

  • Got an issue and looking for advice?

  • Ask Solucija to search every corner of the Web for help.

  • Get workable solutions and helpful tips in a moment.

Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.