将子域映射应用于Hostgator中的插件域

时间:2014-10-31 19:51:16

标签: apache .htaccess mod-rewrite

我有2个域名,都托管在hostgator(无限域名宝贝计划)上 1. foo.com(这是第一个在HG注册的域名)
2. bar.com(我在HG中将其添加为插件域)

目录结构有/public_html/,它保存了foo.com

的所有文件和子目录

/public_html/有一个名为bar的子目录(即public_html/bar/),它保留了bar.com的所有文件。这是由HG在插件域过程中设置的。所以bar.com的文件会显示如下:/public_html/bar/process.php

我想要这个:
sss.bar.com/fff - > bar.com/process.php?sub=sss&file=fff
但是我的查找失败了。

这就是我尝试的:(这个文件是/public_html/bar/.htaccess - 在foo.com的父目录中有一个单独的.htaccess,它有一个不相关的规则)

RewriteEngine On

# Parse the subdomain as a variable we can access in PHP, and
# run the main process.php script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST}        !^www
RewriteCond %{HTTP_HOST}         ^([^\.]+)\.([^\.]+)\.([^\.]+)$
RewriteRule ^(.*)$ /process.php?sub=%1

# Map all requests to the 'path' get variable in process.php
RewriteRule ^process\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /process.php?file=$1 [L,QSA] 

试验:
1. bar.com/myFile - >在[file] => myFile - good。的process.php中生成一个GET parm 2. test.bar.com/myFile不起作用。

错误是:

  

找不到test.bar.com上的服务器,因为   DNS查找失败

  1. bar.foo.com/file1会产生[file] => /process.php [sub] => bar
  2. 的GET

    我认为这可能是由于HG构建我的插件域的方式 - 作为子域。所以现在它认为我正在尝试重新映射子域的子域...如果这是有道理的。

    感谢。

    更新
    添加了通配符子域并按如下所示修改了.htaccess之后,看起来好像它正在按需工作。

    Options +FollowSymlinks  
    RewriteEngine On  
    
    RewriteCond %{REQUEST_FILENAME} !-f  
    RewriteCond %{REQUEST_FILENAME} !-d  
    
    RewriteCond %{HTTP_HOST} !^www  
    RewriteCond %{HTTP_HOST} !^bar\.com$  
    
    RewriteCond %{HTTP_HOST} ^(^.*)\.bar\.com$  
    
    RewriteRule ^(.*)/$  index.php?userId=%1&fileName=$1  
    

2 个答案:

答案 0 :(得分:1)

您的test.bar.com子域很可能是全球DNS系统所不知道的。要知道,您必须在DNS系统中注册它。 (如果这仅供您私人使用而非公开使用,您可以使用系统/etc/hosts文件将名称映射到服务器ip)

我认为Hostgator是Domain Name Registrar主域)和foo.com插件域)的bar.com和你拥有域控制面板(CPanel / Plesk /等)的访问权限,以执行所需的操作。

当您为主域(bar.com)购买了插件域(foo.com)时,Hostgator会设置DNS CNAME规范名称记录 )记录 www bar.com指向主域的相同Host记录(也称为A记录/地址记录),以便两个域共享相同的主机。因此,您现在必须对 test bar.com子域执行相同的操作。你可以在Hostgator找到一个简短的指南:How to change DNS zones (MX, CNAME, and A records) 注意:对DNS记录的更改可能需要几个小时才能生效。

每次想要新的子域时,每次手动设置它们都会很烦人。许多域名注册商(包括Hostgator)也支持名为WildCard域的功能。它们允许您对指向主域的*记录使用CNAME(通配符)。这使得whatever.bar.com指向同一地址www.bar.com

为了支持您的主要,插件域及其子域的各个站点,Apache使用基于域名的虚拟主机。如果要将whatever.bar.com的同一站点加载为www.bar.com,Apache会在ServerAlias指令中允许*通配符。确保在*.bar.com VirtualHost配置中设置www.bar.com作为ServerAlias。否则,您必须为每个子域设置单独的VirtualHost配置 注意:还有一个VirtualDocumentRoot apache指令,可用于根据域名提供单独的文档根。

答案 1 :(得分:0)

工作示例

输入:http://mary.bar.com/awesome/
结果:index.php GET parms:

Array
(
    [userId] => mary
    [fileName] => awesome
)  

这是最后的.htaccess一旦设置了通配符子域我就开始工作了.htaccess添加了解释(主要是为了帮助我)

Options +FollowSymlinks
RewriteEngine On

# 1. Parse the subdomain as a variable we can access in PHP
# 2. Parse out the filename (must have a trailing "/" on the end)
# 3. Pass the vars into index.php script
# Make sure a wildcard subdomain is setup (takes 24-48hrs to propagate) and points to the addon domain folder
# ex: "public_html/addon-domain-name.tld"

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# make sure we don't process "www.domain.com" or "domain.com".  This will just default to index.php with no GET vars
RewriteCond %{HTTP_HOST}        !^www
RewriteCond %{HTTP_HOST} !^bar\.com$

# This part pulls out the subdomain from the front of the URL & stores it in "%1"
# Note: it is possible that the subdomain can have multiple parts (ex bob.smith.domain.com) and still work
#       The user id is either numeric or string [Aa-Zz], so add error checks inside index.php
RewriteCond %{HTTP_HOST} ^(^.*)\.bar\.com$

# IMPT: do not rewrite the rule until the trailing filename is parsed out
#       otherwise .htaccess will try to parse out something from index.php
# Parse out the filename that comes after domain.com (stored in "$1").  A trailing "/" is required.
RewriteRule ^(.*)/$  index.php?userId=%1&fileName=$1