问题描述
|
我们有这个工作流程:
开发在dev.example.com上完成
所做的更改将提交给SVN,然后导出到实时站点。
实时网站位于www.example.com
我想用密码保护dev.example.com,但是如果我用.htaccess进行密码保护,那么我们将在实际站点中使用相同的.htaccess,它也将获得密码保护。
我们正在使用Dreamhost共享主机,我具有SSH访问权限,但是我无法编辑Apache的配置.conf文件。
我们不想为dev&live使用单独的.htaccess文件,而不想在SVN中忽略.htaccess,因为对.htaccess也进行了更新。
所以我该怎么做?
解决方法
如果在服务器上启用了“ 0”,则可以将其添加到“ 1”文件中:
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
它的基本作用是设置一个名为“未认证”的环境变量,但是如果HOST(浏览器请求的主机)恰好是“ dev.example.com”,则将其取消设置。在Directory指令中,“满足任何条件”告诉Apache如果满足以下任一条件,则允许请求。这意味着将不会在\“ dev.example.com \”上设置环境变量,因此,将需要您输入密码。对于任何其他主机,将设置该变量,以便Apache不会要求提供凭据。
,您可以忽略.htaccess
,将其完全排除在存储库之外。然后,每个服务器上只有两个不同的“ 1”文件。因为它们被忽略,所以它们不会在SVN更新中被覆盖。
,在Apache virtualhost配置中而不是.htaccess文件(通常在/etc/apache
或in6ѭ中)进行操作。
我将所有要放入.htaccess的内容都放在这里。这些设置通常需要根据部署而有所不同,因此将它们保留在存储库之外是有意义的。如果Apache可以在启动时加载指令,而不是从每个请求的.htacess文件中加载指令,它也可以使您的应用程序更快。
我通常也会在其中放置这样的指令:
SetEnv APP_ENV production
它将通过您的应用程序传递,并允许您检测您是否处于开发环境还是生产环境中,并相应地调整设置。
我还将此conf文件的副本保留在我的repo的Assets文件夹中,以方便访问。
,在存储库中放入两个文件:
htaccess.dev
htaccess.live
通过首先将所有文件导出到目标服务器,然后根据导出到哪个服务器来重命名正确的htaccess文件,来制作一个照顾部署的脚本。该脚本应该易于调用,并且一步一步完成整个部署,包括处理服务器的主机名等:
deploy dev
或deploy live
是两个不错的命令行。
对于ssh登录,您将不得不提示用户输入脚本中的密码,或者更好的方法是使用基于密钥的身份验证,以便自动登录。
,与其在远程服务器上进行开发,不如在本地计算机上进行开发?您可以在回购中为每个开发人员创建分支,并在准备将其推送到实际站点时将其更改与主干合并。
,您实际上应该将开发和生产环境尽可能地分开。我建议您重新评估使用共享的.htaccess
文件的初衷。以我的经验,像ѭ1这样的服务器文件通常不会经常更新,因此不会对工作效率造成威胁。
如果使用虚拟主机,则可以将授权代码放在该文件(httpd或vhosts配置文件)中,这将允许您仍然使用共享的.htaccess文件。
,@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.
}
可以将其放入公共包含文件中,或放在每个页面的顶部。请注意,开发人员和生产人员之间的代码相同,但是值the13ѭ将导致登录代码仅在开发服务器上执行。
如果我错过了商标,或者您想澄清如何处理登录,请发表评论。
谢谢!
,对文件头进行导入以导入文件include(\"permission.php\")
在dev.example.com上:
Permission.php
<?PHP
// Do a password check
?>
在www.example.com上:
Permission.php
<?PHP
// Just an empty file
?>
在开发站点上,它将执行密码操作所需的操作,但是在实时站点上,它将完全不执行任何操作。
,两个简单的建议-都不需要.htaccess或服务器配置。
1)如果您是基于CMS框架(例如Wordpress)构建的,则只需将网站的隐私设置(仪表板>设置)设置为受开发网站上的密码保护,并且由于所有这些设置都是由数据库管理的,因此您可以只需将直播网站设为公开即可。
...要么...
2)在本地开发并推送到单独的受密码保护的安装。