根据查询字符串重写子域名

根据查询字符串重写子域名

我给 localhost 起了一个别名:“myhost”。在地址栏中输入“myhost”会显示 /var/www/index.php。到目前为止一切顺利。在 /var/www 上设置一个 apache 虚拟主机并将其命名为“myhost”,然后添加三个别名:“*.myhost” “*.myhost.*” “myhost.*”,其工作原理如下:

myhost = 网站索引/登录页面/一般内容

user.myhost = 用户特定的一般内容

myhost.topic = 与用户无关的主题内容

user.myhost.topic = 特定于用户的主题内容

但所有数据都是动态加载的,因此实际的 URL 更像是:

myhost/index.php?user=(空或用户名)&host=myhost&app=(空或主题)

我花了两天时间试图弄清楚这个重写规则,但毫无进展。任何帮助都将不胜感激。

编辑:另外,我是否必须将 user1.myhost、user2.myhost、myhost.topic1、myhost.topic2、user1.myhost.topic1、user2.myhost.topic1、user1.myhost.topic2、user2.myhost.topic2 等添加到我的 hosts 文件中才能使其正常工作?如果是这样,有没有更好的方法?

答案1

您可以使用这些重写规则将所有域重定向到myhost带有主机参数的域。

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} myhost
RewriteRule .* - [L]

RewriteCond %{QUERY_STRING} ^.+$
RewriteRule ^(.*)?(.*)$ $1?$2&host=%{HTTP_HOST} [L]

RewriteRule ^(.*)$ http://myhost/$1?host=%{HTTP_HOST} [L]

您还可以在应用程序中获取域名(例如 php 中的 $_SERVER["SERVER_NAME"])并使用此值。因此您不需要额外的主机参数。

您可以安装一个易于使用的 DNS 服务器(如 tinydns)并设置通配符子域,如 *.myhost 等。但 user2.myhost.topic2 不是有效域。如果您的域名是“example.com”,您的子域应该是“topic1.example.com”或“user1.topic1.example.com”。您不能在互联网上使用“user1.example.topic1”作为域名。

相关内容