我有一个临时服务器和生产服务器,它们托管多个站点(使用 Apache2.2)。目前,我的 DNS 指向stage.domainX.com
临时服务器和*.domainX.com
生产服务器。
一切似乎都运行良好,但我希望能够确保对临时服务器的访问安全。因此,除非是合适的人,否则stage.domainX.com
应禁止试图进入的人(如果可能的话,进入生产服务器)。
而且,我想使用域名而不是 IP,因为我希望客户端能够更友好地查看暂存站点(而不是记住 IP 地址)。
有没有什么好办法可以解决这个问题?或者,我处理暂存域名流程的方式是否不寻常?
PS 我其实一直想通过端口来管理它,但我还没找到办法。例如,domainX.com:80(标准)用于生产,domainX.com:9000 用于准备。不过还没找到在 DNS 中执行此操作的方法(使用 GoDaddy 的名称服务器/区域)。
答案1
使用 Apache,您可以简单地设置临时服务器Allow
和Deny
指令以限制对授权 IP 地址的访问。或者,您可以将整个过程置于 HTTP 身份验证之后(用户名/密码,或者如果您想要真正花哨的话,可以使用客户端证书)。
使用自定义“未授权”错误页面将人们重定向到生产站点可获得加分。
配置 Apache 在不同的端口上为暂存站点提供服务也是一个选择,但这只是像使用域一样的“通过隐蔽性实现安全性” stage.domainX.com
——它不会阻止任何人找到暂存站点。
<rant>
请注意,更改端口不是DNS 是 Web 服务器配置的一部分(有关详细信息,请参阅 Apache 手册)。DNS 具有没有概念端口号,它只是一个名称到 IP(或 IP 到名称)的映射*——令人讨厌。
* 有一些有限的例外,如 SRV 记录,但我们谈论的是A地址和别名记录记录
答案2
我过去曾成功使用过类似以下的 Apache 设置;它允许某些列出的 IP 地址自由访问暂存站点,而无需提供基本身份验证凭据(例如,您可以添加您办公室和您客户办公室的 IP 地址),但如果客户不在办公室,仍然允许基于密码的访问。
# Set NOAUTH environment-variable for certain IPs that are allowed without credentials
SetEnvIf Remote_Addr 11.22.33.44 NOAUTH=1
# Staging
<VirtualHost *:80>
ServerName stage.domainX.com
DocumentRoot /var/www/stage.domainX.com
# Access restrictions
<Location />
Order allow,deny
# Anyone with the NOAUTH environment variable is allowed
Allow from env=NOAUTH
# Anyone that has valid credentials is allowed
AuthType Basic
AuthName "DomainX Staging"
AuthUserFile /etc/apache2/staging.domainX.com.passwd
Require valid-user
# Either of the above is fine
Satisfy Any
</Location>
# ... other directives ...
</VirtualHost>
# Production
<VirtualHost *:80>
ServerName domainX.com
DocumentRoot /var/www/domainX.com
# ... other directives ...
</VirtualHost>