.htaccess子域名重定向无法正常工作

时间:2010-11-17 09:35:57

标签: .htaccess mod-rewrite redirect subdomain

好的,现在我迷路了。

我正在尝试将子域的简单.htaccess重定向到服务器上的特定文件夹,这意味着所有

subdomain.mywebsite.com

将转到

www.mywebsite.com/s_subdomain

但由于某些原因,这不起作用。

我在.htaccess中尝试了很多设置,但没有任何好处。现在我的.htaccess我有:

RewriteEngine on

Options +FollowSymLinks
Options +SymlinksIfOwnerMatch

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

是否还有其他设置,或者我错过了哪些设置?

PS。 - 我无法访问http.conf。我必须只使用.htaccess

谢谢!

4 个答案:

答案 0 :(得分:3)

这只是一个“普通”重写(浏览器不会看到它)。要重定向,请将R标志添加到RewriteRule。

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

其余的似乎是正确的,虽然我还没有测试过。对于调试,您可以考虑使用RewriteLog,请参阅http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog

答案 1 :(得分:1)

那么,两种解决方案都不起作用吗?尝试简单的事情。

RewriteEngine on

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

要测试您的子域是否得到正确处理,请创建random.html文件,将其放在应该从中读取的位置,然后尝试通过http://subdomain.yoursite.com/random.html打开它。然后你可以尝试一些类似的东西:

RewriteRule ^random.html - [F]

...如果阻止访问文件,请尝试预先

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

到之前的规则,阻止访问该文件,以确保重写引擎实际上符合您的规则。这将仅针对所需的子域(www.yoursite.com/random.html应该可以工作,但不应通过子域访问)。

然后,如果这些规则有效,那只需要添加更多东西,看看它何时停止工作。

答案 2 :(得分:0)

RewriteRules是一个婊子。

以下内容应该有效:

<强>的.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);
?>

在我的服务器上运行(debian 4 / apache 2)。

奖励:不要使用HTTP_HOST!请参阅以下请求:

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

如果在.php脚本中使用$_SERVER['HTTP_HOST']来构建链接或.htaccess规则,“www.host.tld”是为Apache配置的虚拟主机或唯一主机,则XSS in HTTP请求标头将向下传递未转义。

答案 3 :(得分:0)

我们的虚拟机上有类似的东西,我们将anything.usertld重定向到该域的文件夹,该文件夹位于httpd.conf中,在.htaccess中试过,与你的一样,它不起作用。< / p>

调整它,这适用于我(我的VM占用了一个名为benb的tld,但将其更改为您的域应该没问题):

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

此外,它会捕获域名之前的所有文本..您应该能够更改:

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

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

只处理1级子域。你的另一部分(www | ftp | mail)也可以正常工作。