我正在使用django开发弹性beanstalk,我想对apache配置进行两处更改:
1。 将www.domain.com重定向到domain.com
2。 将http://domain.com重定向到https://domain.com
我没有使用apache配置的经验,谷歌搜索它让我知道我应该把RewriteRules放在.htaccess文件中。
例如: How to force https on amazon elastic beanstalk without failing the health check
我找不到有关如何使用弹性beanstalk配置(.ebextensions)的说明,我试图简单地将.htaccess文件放在我的root filder中并进行部署,但它没有用。
有谁知道如何在弹性beanstalk中添加RewriteRules?
答案 0 :(得分:46)
如果您不关心实际是重定向,那么www.example.com
转到example.com
可以通过DNS中的CNAME完成。如果需要重定向,可以将其添加到下面的Apache配置中。这个答案的主要内容是详细说明如何在Elastic Beanstalk上修改Apache配置(因为这样做不是很直接)。
此答案假设您已在负载均衡器安全组中启用了https,将SSL证书添加到负载均衡器,将443添加到负载均衡器转发的端口,并使用路由将您的域名指向Elastic Beanstalk环境53(或等效的DNS服务)。
您需要做的就是将以下内容添加到.conf
files in the .ebextensions
directory of your project之一:
files:
"/etc/httpd/conf.d/ssl_rewrite.conf":
mode: "000644"
owner: root
group: root
content: |
RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>
这在Elastic Beanstalk之外是适度的直接。通常会添加一个Apache重写规则,如下所示:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
或者,如果在负载均衡器后面,就像我们在这种情况下一样:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
但是,这些配置仅适用于<VirtualHost>
块。将RewriteCond
更改为<If>
块可以使其在<VirtualHost>
块之外正常工作,从而允许我们输入独立的Apache配置文件。请注意,CentOS上的标准Apache设置(包括ElasticBeanstalk上的设置)会包含所有匹配/etc/httpd/conf.d/*.conf
的文件,这些文件与我们存储此文件的文件路径相匹配。
如果您不在负载均衡器之后,条件的-n '%{HTTP:X-Forwarded-Proto}'
部分会阻止它重定向,允许您在具有负载均衡器和https的生产环境与单个分段环境之间进行共享配置实例,没有https。如果您在所有环境中使用负载均衡器和https,则无需这样做,但拥有它并不会有什么坏处。
我已经看到了很多解决这个问题的坏方法,值得深入了解为什么这个解决方案是必要的。
使用Cloudfront:有些人建议在Elastic Beanstalk前面使用非缓存Cloudfront设置来执行HTTP到HTTPS重定向。这增加了一项并非完全合适的全新服务(因此增加了复杂性)(Cloudfront是一个CDN;它不是在非常动态内容上强制HTTPS的正确工具)。 Apache配置是解决此问题的正常方法,Elastic Beanstalk使用Apache,这是我们应该采用的方式。
SSH进入服务器并......:这与Elastic Beanstalk完全相反,并且存在很多问题。通过自动缩放创建的任何新实例都没有修改后的配置。任何克隆的环境都没有配置。任何数量的合理环境更改都将消除配置。这真是个坏主意。
使用新文件覆盖Apache配置:如果Elastic Beanstalk更改了服务器设置的各个方面(即他们),这会进入正确的解决方案领域,但会让您遇到维护噩梦很好可能)。另请参阅下一项中的问题。
动态编辑Apache配置文件以添加几行:这是一个不错的主意。这样做的问题在于,如果Elastic Beanstalk更改了默认Apache配置文件的名称,它将无法正常工作,并且当您最不期望时,此文件可能会被覆盖:https://forums.aws.amazon.com/thread.jspa?threadID=163369
答案 1 :(得分:4)
这是一个简单的解决方案
编辑wsgi.conf的本地版本,并在&lt;中添加以下重定向规则。虚拟主机&GT; &LT; /虚拟主机&GT;标签
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
将“/ status”更改为您用作运行状况检查页面的任何页面。
编辑你的&lt;你的。 ebextensions 目录中的app&gt; .conf文件,用于添加容器命令,以便通过亚马逊的版本复制此版本的wsgi.conf
container_commands:
01_syncdb:
command: "django-admin.py syncdb --noinput" leader_only: true
02_collectstatic:
command: "django-admin.py collectstatic --noinput"
03_wsgireplace:
command: 'cp wsgi.conf /etc/httpd/conf.d/wsgi.conf'
...
部署代码。
它应该可以正常工作,并且每个部署都会正确更新文件。唯一需要注意的是,如果Amazon将来更改其基本wsgi.conf文件内容,那么您的副本可能不再有效。
答案 2 :(得分:2)
仅供其他人参考,使用Zags' solution将非www重定向到www,将其添加到您的$ cat file1
|1|
$ cat file2
|2|
|3|
$ cat file3
|4|
|5|
|6|
$ paste -d ',' file[123] | sed -e 's/|//g' -e 's/^/|/g' -e 's/$/|/g'
|1,2,4|
|,3,5|
|,,6|
:
.ebextensions/your_file.config
答案 3 :(得分:2)
在以下AWS文档中对此进行了很好的解释:
要扩展Elastic Beanstalk的默认Apache配置,请将.conf配置文件添加到应用程序源包中名为.ebextensions/httpd/conf.d
的文件夹中。 Elastic Beanstalk Apache配置自动在此文件夹中包含.conf文件。
~/workspace/my-app/
|-- .ebextensions
| -- httpd
| -- conf.d
| -- myconf.conf
| -- ssl.conf
-- index.jsp
要完全覆盖Elastic Beanstalk的默认Apache配置,请在源包中的.ebextensions/httpd/conf/httpd.conf
中包含一个配置。
~/workspace/my-app/
|-- .ebextensions
| `-- httpd
| `-- conf
| `-- httpd.conf
`-- index.jsp
如果您覆盖Elastic Beanstalk Apache配置,则将以下行添加到httpd.conf中,以拉入Elastic Beanstalk配置以增强运行状况报告和监视,响应压缩和静态文件。
IncludeOptional conf.d/*.conf
IncludeOptional conf.d/elasticbeanstalk/*.conf
注意
要覆盖端口
80
上的默认侦听器,请包括一个名为00_application.conf
在.ebextensions/httpd/conf.d/elasticbeanstalk/
覆盖 Elastic Beanstalk配置。
对于一个有效的示例,请查看您环境中实例上/etc/httpd/conf/httpd.conf
处的Elastic Beanstalk默认配置文件。部署期间,源捆绑包中.ebextensions/httpd
文件夹中的所有文件都将复制到/etc/httpd
。
可以在Extending and overriding the default Apache configuration
下的link上看到更多详细信息。最好使用正确的方法代替补丁或解决方法。