如何检测来自CNAME子域的传入请求(使用PHP脚本)?

我们有一个简单的基于PHP的redirect应用程序。

这是一个例子:

spiderman.com/redirection/redirect-to-marvel/

php脚本在“redirect”文件夹中,假设它将上面的链接redirect到marvel.com

现在…

如果我想创build一个名为try.superman.com的完全不同的子域名,它使用CNAMEredirect到spiderman.com/redirection/,这样如果我打开这个URL:

它将实际转发到spiderman.com/redirection/redirect-to-marvel/这当然会将其转发到marvel.com

简而言之,浏览器将显示try.superman.com/redirect-to-marvel/(由于CNAME),但是我如何在服务器端检测来自CNAMElogging的传入请求并将其路由到正确的本地文件夹?

只需要一些方向…

PHP的dns_get_record + htaccess正确的方向?

一个重要的区别是CNAME和重写/redirect(或虚拟主机)是完全不同的东西,经常会感到困惑。

CNAME是一个DNS实体,所以你可以有多个名字指向一个单一的地址。 例如,bob.example.com是位于1.2.3.4的主机。 然后,您可以为alice.example.com创build一个CNAME,它指向bob进行DNSparsing并返回相同的IP地址。

redirect是一种HTTP方法,用于接收某个位置( http://bob.example.com/index.html )的请求,并向浏览器返回一条指令到其他位置( http://alice.example .com / somewhereelse.html )客户端的浏览器显示。

重写是一种HTTP方法,用于接收某个位置的请求,将其更改,然后将其发送到应答服务器,而不必让客户端的浏览器知道发生了该请求。

一个虚拟主机(虚拟主机等等,对同一个函数有不同的名称)是一种HTTP方法,它允许你通过查看请求的名字来以不同的方式回答请求,通常通过检查HTTP主机头包含在每个请求中 以上述为例:客户端请求http://alice.example.com ,通过DNSparsing为1.2.3.4,因为alice是一个CNAME到bob.example.com。 请求login到相同的IP地址1.2.3.4,但运行在那里的Web服务器用/ alice中的内容而不是/ bob来回答请求。

希望有所帮助

如果你想用PHP来做,你通常会做的是configuration你的web服务器,把所有的子域都提供给一个特定的虚拟主机,这个虚拟主机通过一个路由PHP脚本运行所有的请求,这个脚本将完成redirect。 像这样的东西:

<?php $map = array( "try.superman.com" => array( "/redirect-to-marvel/" => "http://spiderman.com/redirection/redirect-to-marvel/", ), ); if (isset($map[$_SERVER["HTTP_HOST"]]) { if (isset($map[$_SERVER["HTTP_HOST"]][$_SERVER["REQUEST_URI"]])) { header("Location: " . $map[$_SERVER["HTTP_HOST"]][$_SERVER["REQUEST_URI"]]); exit; } } header("Location: http://spiderman.com/404.php"); 

有很多改进的空间,包括使用mod_rewrite(或者相当于你的web服务器,但是我假设你在这里使用Apache,因为你提到了.htaccess )。

使用PHP,您可以灵活地查询数据库以进行正确的redirect。