使用 Apache 2 调整转发到具有路由和静态文件的 Flask 应用程序

Adapting the forwarding to Flask application with routes and static files with the Apache 2

http://servername.com:5000/ 上有一个 Flask 应用程序 运行。它封装了一些 Bootstrap 和 gis_webapp/static/... 中提供的静态文件,它们按应有的方式工作。

这是项目的树:

gis_webapp
├── __init__.py
├── routes.py
├── gunicorn_gis_webapp_conf.py
├── static
│   ├── bootstrap-4.6.0-dist
│   │   ├── css
│   │   └── js
│   ├── css
│   │   └── style.css
│   └── img
│       ├── favicon.png
│       └── glogo.gif
└── templates
    ├── about.html
    ├── base.html
    ├── contact.html
    ├── errors
    │   └── 404.html
    ├── index.html
    └── result.html

只要我通过 http://servername.com/ 在同一服务器上运行的 mod_auth_gssapi 通过 Apache2 应用转发( http://servername.com:80/) 使用 http://servername.com/gis/继承http://servername.com:5000/的全部内容,以下内容停止工作:

  1. 路由之间的通信

    当我点击导航栏中的 联系人 link 时,它会将我带到 http://servername.com/contact/ (which does not exist) instead of http://servername.com/gis/contact

  2. 来自 /static 文件夹的内容

  3. Bootstrap 来自 gis_webapp/static/bootstrap-4.6.0-dist 文件夹

我做错了什么?

.conf 文件的内容如下:

<VirtualHost *:80>
    <Location /gis/>
        ProxyPass "http://localhost:5000/"
        ProxyPassReverse "http://localhost:5000/"
    </Location>
</VirtualHost>

我在这些线程中找到了一些建议并尝试应用这些建议:

很遗憾,他们没有解决我的问题。

我还尝试修改 routes.py 文件中的路径。

# main page
@gis_webapp.route("/", methods=["GET"])
@gis_webapp.route("/index", methods=["GET"])
def index():
    return render_template("index.html", title="GIS")

改写为:

# main page
@gis_webapp.route("/gis/", methods=["GET"])
@gis_webapp.route("/gis/index", methods=["GET"])
def index():
    return render_template("index.html", title="GIS")

我还发现这个线程 Serving static files through apache 建议应用 ALIAS,但这对我来说不是一个解决方案,因为以后 Apache2 和 Flask 应用程序将在不同的服务器上。但是,有一种观点:statics需要由Apache来分发,即使你再分散到不同的服务器上,那么最好将statics挂载到Apache所在的地方。


到现在我可以部分解决 2.3. 在 'base.html' 中完成调整的问题,所以这个参考:

<link rel="icon" type="image/png" href="/static/img/favicon.png">

已更改为:

<link rel="icon" type="image/png" href="/gis/static/img/favicon.png">

所以,之后我可以在 http://servername.com/gis/ 页面上看到 /static 文件夹的内容,但是当我打开它虽然http://servername.com:5000/ ...不明白为什么。有什么想法吗?

解决方案是部署 SCRIPT_NAME 变量和 Gunicorn as suggested in this article:

SCRIPT_NAME="/gis" gunicorn --bind=0.0.0.0:5000 gis_webapp:gis_webapp

之后我可以通过 http://servername.com/gis/

访问该应用程序

然而初始URLhttp://servername.com:5000/ was yielding the Internal Server Error. To overcome it, simply use the http://servername.com:5000/gis/.