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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.htaccess子域名重定向无法正常工作相关的知识,希望对你有一定的参考价值。

好的,现在我迷路了。

我正在尝试将子域的简单.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

谢谢!

答案

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

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

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

另一答案

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

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应该可以工作,但不应通过子域访问)。

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

另一答案

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配置的虚拟主机或唯一主机,则HTTP请求标头中的XSS将被传递没有转义。

另一答案

我们在我们的虚拟机上有类似的事情,我们将anything.usertld重定向到该域的文件夹,在httpd.conf中,在.htaccess中尝试过,像你的一样,它不起作用。

调整它,这适用于我(我的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)也可以正常工作。

以上是关于.htaccess子域名重定向无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nginx 将数百个主机名重定向到其他主机名

.htaccess 重定向影响子域

htaccess中的永久重定向查询无法正常工作

.htaccess 重定向到子域

使用 .htaccess 将所有子域和子目录重定向到索引页面

htaccess中的子域重定向[关闭]