开发者

.htaccess subdomains redirect is not working

Ok, now I am lost.

I am trying to do a simple .htaccess redirect of subdomains to a specific folder on the server, meaning all

subdomain.mywebsite.com

will go to

www.mywebsite.com/s_subdomain

But for some reasons this doesn't work.

I have tried a lot of settings in .htaccess but for no good. Now in my .htaccess I have:

RewriteEngine on

Options +FollowSymLinks
Options +SymlinksIfOwnerMatch

RewriteCond %{HTTP_HOST} !^(www|ftp|mail)\.mywebsite\.com
RewriteCond %{HTTP_HOST} ^([^.]+)\.mywebsite\.com
RewriteRule (.*) /s_%1/$1 [L]

Are there any other settings, or is somethig I have missed?

PS. - I don't have access to http.conf. I have to do it using only .htacces开发者_如何学Pythons

Thanks!


This is just a "plain" rewrite (the browser won't see it). To redirect, add the R flag to your RewriteRule.

RewriteRule (.*) /s_%1/$1 [L,R]

The rest seems right, although I haven't tested it. For debugging you could consider RewriteLog, see http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog


So, neither solution does work? Try something simple then.

RewriteEngine on

RewriteCond ${SERVER_NAME} ^(subdomain)\.yoursite\.com$ [nc]
RewriteRule ^(.*)$ http://www.yoursite.com/s_%1/$1 [L,R]

To test if your subdomain is handled correctly, create random.html file, place it where it should be read from, and try opening it via http://subdomain.yoursite.com/random.html. Then you can try some stuff like:

RewriteRule ^random.html - [F]

...and if that blocks access to file, try prepending

RewriteCond ${SERVER_NAME} ^subdomain\.yoursite\.com$ [nc]

to previous rule, to block access to that file, to make sure that rewrite engine is actually hitting your rules. That would target only desired subdomain (www.yoursite.com/random.html should work, but access via subdomain shouldn't).

Then if those rules work, it's just a matter of adding more stuff and see when it stops working.


RewriteRules are a bitch.

The following should work:

.htaccess:

RewriteCond ${SERVER_NAME} !^(www|ftp|mail)\.example\.com$
RewriteCond ${SERVER_NAME} !^([^.]+)\.example\.com$
RewriteRule .* redirect.php?to=%1

redirect.php

<?php
   $desired_server_name = 'http://example.com';
   $subdir = 's_' . $_GET['to'];

   $url = $desired_server_name . '/' . $to . $_SERVER['REQUEST_URI'];

// Permanent redirects
   header('HTTP/1.1 301 Moved Permanently');

// Or simple redirects:
   header('HTTP/1.1 302 Found');

   header('Location: '.$url);
?>

Works on my server (debian 4/apache 2).

Bonus: do not EVER use HTTP_HOST! See the following request:

 HTTP/1.1 GET /foo/bar.php
 Host: www.host.tld"><script>alert(/Hello/)</script
 Connection: close

If you use $_SERVER['HTTP_HOST'] in your .php scripts to construct links or .htaccess rules for that matter and "www.host.tld" is the virtual-host or the only host configured for Apache, the XSS in the HTTP request header will be passed down unescaped.


We have a similar thing working on our Virtual Machines, where we redirect anything.usertld to a folder for that domain, that was in httpd.conf, tried in in the .htaccess and like yours it didn't work.

Tweaking it, this works for me (my VM occupies a tld called benb, but changing it to your domain should be fine):

    RewriteCond %{HTTP_HOST} !^www\.benb
    RewriteCond %{HTTP_HOST} ^(.*)\.benb
    RewriteCond %{REQUEST_URI} !^/{0,1}s_
    RewriteRule ^(.*)$ s_%1/$1 [L]

Also this captures all the text before the domain.. you should be able to change:

RewriteCond %{HTTP_HOST} ^(.*)\.benb

to

RewriteCond %{HTTP_HOST} ^([^.]+)\.benb

to handle just 1 level of subdomain. Also your other part about (www|ftp|mail) would work fine too.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜