为什么 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