为什么 AWS Elastic Beanstalk Python 插入一个 'static' 规则优先于所有其他规则?
Why does AWS Elastic Beanstalk Python insert a 'static' rule ahead of all others in priority?
我的 Python 应用程序的 'static' 路由规则在我的 AWS Elastic Beanstalk 应用程序(而不是其他任何地方)中表现异常,似乎覆盖了所有其他规则。
例如,使用下面的两个函数,在我的开发机器和其他地方以及 AWS 上的测试服务器上,routes
最后列出静态规则,match_route
显示其他非静态规则匹配以 'static/...' 开头的路径。正如预期的那样,如果我在我的非 AWS 机器上导航到一个路径以 static/...
开头的页面,我的其他(非静态)规则之一就会匹配。但是(仅)在 AWS-EB 上,服务器的静态规则被调用用于此类路径!
为什么 AWS-EB "inserting" 这条规则领先于所有其他规则?我如何在 AWS 上禁用此行为,或在我的非 AWS 系统中复制它?
application.url_map.host_matching = True
# ...
def routes(verbose, wide):
"""List routes supported by the application"""
for rule in sorted(app.url_map.iter_rules()):
if verbose:
fmt = "{:45s} {:30s} {:30s}" if wide else "{:35s} {:25s} {:25s}"
line = fmt.format(rule, rule.endpoint, ','.join(rule.methods))
else:
fmt = "{:45s}" if wide else "{:35s}"
line = fmt.format(rule)
print(line)
def match_route(host, match):
"""Match a route for a given host"""
if match is not None:
urls = app.url_map.bind(host)
try:
m = urls.match(match, "GET")
z = '{}({})'.format(m[0], ','.join(["{}='{}'".format(arg, m[1][arg]) for arg in m[1]] +
["host='{}'".format(host)]))
return z
except NotFound:
return
这是 /etc/httpd/conf.d/wsgi.conf
中 Apache 服务器配置的结果,其中包含
Alias /static/ /opt/python/current/app/static/
如果您删除或注释掉该行,服务器将不再 "intercept" 以 'static' 开头的路径。
然而,实现这一点比人们想象的要复杂一些,因为 wigs.conf
文件得到(重新)创建 after files are uploaded and commands 被执行。
解决此问题的一种方法是使用 post-部署挂钩修改文件,确保之后重新启动网络服务器:
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/remalias.sh" :
mode: "00775"
owner: root
group: root
content: |
sed -i.backup -e 's/^Alias\s[/]static[/]\s[a-z/]*$//g' /etc/httpd/conf.d/wsgi.conf
service httpd restart
我的 Python 应用程序的 'static' 路由规则在我的 AWS Elastic Beanstalk 应用程序(而不是其他任何地方)中表现异常,似乎覆盖了所有其他规则。
例如,使用下面的两个函数,在我的开发机器和其他地方以及 AWS 上的测试服务器上,routes
最后列出静态规则,match_route
显示其他非静态规则匹配以 'static/...' 开头的路径。正如预期的那样,如果我在我的非 AWS 机器上导航到一个路径以 static/...
开头的页面,我的其他(非静态)规则之一就会匹配。但是(仅)在 AWS-EB 上,服务器的静态规则被调用用于此类路径!
为什么 AWS-EB "inserting" 这条规则领先于所有其他规则?我如何在 AWS 上禁用此行为,或在我的非 AWS 系统中复制它?
application.url_map.host_matching = True
# ...
def routes(verbose, wide):
"""List routes supported by the application"""
for rule in sorted(app.url_map.iter_rules()):
if verbose:
fmt = "{:45s} {:30s} {:30s}" if wide else "{:35s} {:25s} {:25s}"
line = fmt.format(rule, rule.endpoint, ','.join(rule.methods))
else:
fmt = "{:45s}" if wide else "{:35s}"
line = fmt.format(rule)
print(line)
def match_route(host, match):
"""Match a route for a given host"""
if match is not None:
urls = app.url_map.bind(host)
try:
m = urls.match(match, "GET")
z = '{}({})'.format(m[0], ','.join(["{}='{}'".format(arg, m[1][arg]) for arg in m[1]] +
["host='{}'".format(host)]))
return z
except NotFound:
return
这是 /etc/httpd/conf.d/wsgi.conf
中 Apache 服务器配置的结果,其中包含
Alias /static/ /opt/python/current/app/static/
如果您删除或注释掉该行,服务器将不再 "intercept" 以 'static' 开头的路径。
然而,实现这一点比人们想象的要复杂一些,因为 wigs.conf
文件得到(重新)创建 after files are uploaded and commands 被执行。
解决此问题的一种方法是使用 post-部署挂钩修改文件,确保之后重新启动网络服务器:
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/remalias.sh" :
mode: "00775"
owner: root
group: root
content: |
sed -i.backup -e 's/^Alias\s[/]static[/]\s[a-z/]*$//g' /etc/httpd/conf.d/wsgi.conf
service httpd restart