我做了很多搜索并尝试了很多方法,但仍然没有找到完全按照我想要的方式实现这一点。
无需为每个子域创建 Apache VirtualHost,无论是使用 apache2(最好)、htaccess 还是 DNS,我都想重定向:
domain.xyz
到domain.com
domain.xyz/*
到domain.com/*
*.domain.xyz
到*.domain.xyz
(所以a.domain.xyz
去a.domain.com
并且b.domain.xyz
去b.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 替换为您想要的域。这意味着以下更改:
编辑你的 Apache 配置,并添加类似下面的内容。以下内容来自这里。
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !index.php RewriteRule .* index.php?url=$0 [QSA,L]
这样,任何请求都将被转发到
index.php
您在指令中定义的任何文件DocumentRoot
。在该文件中,你可以执行以下操作:
<?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
。 最后一次尝试已经过测试并且效果很好。