将所有子域、子页面和根域重定向到另一个域上

将所有子域、子页面和根域重定向到另一个域上

我做了很多搜索并尝试了很多方法,但仍然没有找到完全按照我想要的方式实现这一点。

无需为每个子域创建 Apache VirtualHost,无论是使用 apache2(最好)、htaccess 还是 DNS,我都想重定向:

  • domain.xyzdomain.com
  • domain.xyz/*domain.com/*
  • *.domain.xyz*.domain.xyz(所以a.domain.xyza.domain.com并且b.domain.xyzb.domain.com
  • *domain.xyz/**.domain.com/*

做到这一点最简单的方法是什么?

答案1

方法 1

免责声明:我还没有尝试过第一种方法,但我认为它可能会有效。

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(.*)\.xyz$
    RewriteRule ^/(.*)$ http://%1.com/$1 [R=301,L]
</VirtualHost>

因此,第一个RewriteCond应该匹配 ,HTTP_HOST如果它以 结尾,它基本上就是您的域名.xyz。如果是这样,您只需.com使用相同的 URI 将请求重写到 TLD。

方法 2

还有另一种方法。您可以简单地将任何请求转发到静态 PHP 文件,并将原始 URL 作为参数放入脚本中,一旦调用,就将 URL 替换为您想要的域。这意味着以下更改:

  1. 编辑你的 Apache 配置,并添加类似下面的内容。以下内容来自这里

    RewriteEngine on
    
    RewriteCond %{REQUEST_FILENAME} !index.php
    RewriteRule .* index.php?url=$0 [QSA,L]
    

    这样,任何请求都将被转发到index.php您在指令中定义的任何文件DocumentRoot

  2. 在该文件中,你可以执行以下操作:

    <?php
       $url =  "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
       $escaped_url = htmlspecialchars($url, ENT_QUOTES, 'UTF-8');
    
       preg_match("/^http:\/\/(.*)\.xyz(.*)$/", $escaped_url, $matches);
       header("Location: http://{$matches[1]}.com{$matches[2]}");
    ?>
    

    因此,您只需将原始 URL(存储在 内$url)与正则表达式进行匹配,并将用户的位置(通过header())函数更改为相同的域,但使用不同的TLD。 最后一次尝试已经过测试并且效果很好。

相关内容