我们有这个工作流程: 开发在dev.example.com上完成 更改将提交到SVN,然后导出到实际站点。 直播网站位于www.example.com
我想密码保护dev.example.com,但如果我使用.htaccess,我们将在现场使用相同的.htaccess,它也会受到密码保护。
我们正在使用Dreamhost共享主机,我有SSH访问权限,但我无法编辑Apache的配置.conf文件。
我们不希望为dev& live提供单独的.htaccess文件,并忽略SVN中的.htaccess,因为也会对.htaccess进行更新。
那我该怎么办?
答案 0 :(得分:37)
如果服务器上启用了mod_setenvif
,您可以将其添加到.htaccess
文件中:
SetEnvIfNoCase ^HOST$ .+ unauthenticated
SetEnvIfNoCase ^HOST$ ^dev\.example\.com$ !unauthenticated
AuthType Basic
AuthName "Secured"
AuthUserFile /path/to/.htpasswd
Require valid-user
Order allow,deny
Allow from env=unauthenticated
Satisfy any
这基本上做的是它设置一个名为“unauthenticated”的环境变量,但如果HOST(浏览器请求的主机)正好是“dev.example.com”则取消设置。在Directory指令中,“满足任何”告诉Apache在满足任何一个条件时允许请求。这意味着在“dev.example.com”上,环境变量将不会被设置,因此,您将需要一个密码。对于任何其他主机,将设置该变量,以便Apache不会要求凭据。
答案 1 :(得分:9)
您可以忽略.htaccess
,将其完全保留在存储库中。然后在每台服务器上只有两个不同的.htaccess
文件。因为它们被忽略了,所以它们不会被SVN更新覆盖。
答案 2 :(得分:6)
在Apache虚拟主机配置而不是.htaccess文件中执行此操作(通常位于/etc/apache
或/etc/apache2
。)
我把所有可能进入我的.htaccess的东西放在这里。这些设置通常需要根据部署而有所不同,因此将它们保留在repo之外是有意义的。如果Apache可以在启动时加载指令,而不是在每个请求上从.htacess文件加载指令,它也会使你的应用程序更快一些。
我通常也会在这里放一个这样的指令:
SetEnv APP_ENV production
哪些内容会传递到您的应用,并允许您检测您是否处于开发与生产环境中并相应地调整设置。
我还会将此conf文件的副本保存到我的repo的assets文件夹中,以便于访问。
答案 3 :(得分:3)
将两个文件放入存储库:
首先将所有文件导出到目标服务器,然后根据导出到哪个服务器重命名正确的htaccess文件,制作一个负责部署的脚本。该脚本应该只需一步即可调用和整个部署,包括处理服务器的主机名等:
deploy dev
或deploy live
是两个很好的命令行。
对于ssh登录,您必须提示用户输入脚本中的密码,或者更好,使用基于密钥的身份验证,以便自动登录。
答案 4 :(得分:2)
为什么不在本地计算机上开发,而不是在远程服务器上开发?您可以在回购中为每个开发人员创建分支,并在他们准备将其推送到实际站点时将其更改与主干合并。
答案 5 :(得分:2)
您应该确保您的开发和生产环境尽可能分开。我建议您重新评估您最初使用共享.htaccess
文件的愿望。根据我的经验,.htaccess
等服务器文件通常不会经常更新,因此不会对生产力造成风险。
如果您使用的是虚拟主机,则可以将授权代码放在该文件中(httpd或vhosts配置文件),这样您仍然可以使用共享的.htaccess文件。
答案 6 :(得分:2)
@formicin,
我认为主要目标是不让窥探你的开发内容。
如果要在代码中实现逻辑(而不是通过Apache配置),则可以使用HTTP请求本身中指定的主机名。
$dev_server = "dev.mysite.com";
$hostname_used_to_access_site = $_SERVER['SERVER_NAME'];
if (strcasecmp($hostname_used_to_access_site, $dev_server) == 0) {
// The server name sent by the browser matches the name
// of the dev server, so check for a valid session. If
// the user hasn't already logged in, redirect to a
// login page.
}
这可以放在一个公共的包含文件中,也可以放在每个页面的顶部。请注意,dev和production之间的代码是相同的,但$_SERVER['SERVER_NAME']
的值将导致登录代码仅在开发服务器上执行。
如果我错过了商标,或者您想澄清如何处理登录,请发表评论。
谢谢!
答案 7 :(得分:1)
在文件标题中导入以提取文件include("permission.php")
: permission.php
<?PHP
// Do a password check
?>
在www.example.com上: permission.php
<?PHP
// Just an empty file
?>
在开发网站上,它将完成为密文所做的工作,但在现场网站上它根本不会做任何事情。
答案 8 :(得分:-1)
两个简单的建议 - 既不需要.htaccess也不需要服务器配置。
1)如果您正在构建一个CMS框架(如Wordpress),您只需将站点的隐私设置(仪表板&gt;设置)设置为在开发站点上受密码保护,并且因为所有这些设置都是数据库管理的,您可以将实时网站设置为公开。
... ... OR
2)在本地开发并推送到单独的密码保护安装。