【问题标题】:Getting Flask to use the desired URL behind mod-rewrite让 Flask 在 mod-rewrite 后面使用所需的 URL
【发布时间】:2015-01-31 23:59:32
【问题描述】:

我有一个在 Apache 上的 mod_wsgi 下运行的 Flask 应用程序。由于网站的各个部分是静态的,而其他部分是动态的,因此网站的动态部分使用mod_rewrite 路由到 Flask 应用程序,如下所示:

.htaccess

RewriteEngine on
RewriteBase /

RewriteRule ^(foo(/.*)?)$    /myapp.wsgi/$1  [L,QSA]
RewriteRule ^(bar(/.*)?)$    /myapp.wsgi/$1  [L,QSA]
# etc.

myapp.wsgi

from flask import Flask, request

application = Flask(__name__)

@application.route("/foo/")
def foo():
    return request.url

@application.route("/bar/")
def bar():
    return redirect(request.url + "baz/")

当我访问http://www.mywebsite.com/foo/ 时,页面告诉我我的网址是http://www.mywebsite.com/myapp.wsgi/foo/

当我访问http://www.mywebsite.com/bar/ 时,页面会将我重定向到http://www.mywebsite.com/myapp.wsgi/bar/baz/

Flask 的自动重定向也会发生这种情况:当我访问 http://www.mywebsite.com/foo(没有尾部斜杠)时,Flask 重定向以添加斜杠,但它重定向到 http://www.mywebsite.com/myapp.wsgi/foo/

有没有一种简单的方法可以让 Flask 应用程序在 URL 中不包含 /myapp.wsgi,而只使用相对于路由所在位置的 URL? (例如/foo//bar/

【问题讨论】:

    标签: .htaccess url mod-rewrite flask mod-wsgi


    【解决方案1】:

    我不知道我是否理解得很好,但您可能想使用此处记录的url_for 函数: http://flask.pocoo.org/docs/0.10/api/#flask.url_for

    它允许您通过引用应用程序的端点来构造 URL。 例如url_for('bar') 将构造指向栏端点的相对 URL。

    【讨论】:

    • 这是一个选项,尽管当烧瓶自己提供重定向时这无济于事。例如当 URL 缺少斜杠时,Flask 会自动重定向到带有斜杠的 URL。我已经用这个更新了这个问题。
    • 您可以通过使用route 中的strict_slashes 参数来删除斜杠行为的重定向,但我承认它并不能真正解决问题。您是否尝试在配置中设置 application_root ? application.config.udpate(APPLICATION_ROOT="myapp.wsgi")
    • 我尝试将APPLICATION_ROOT 设置为myapp.wsgi,但这似乎只是为了确保当前的行为。我也尝试将其设置为/www.mywebsite.com,以及将SERVER_NAME 设置为www.mywebsite.com,但都没有成功。
    【解决方案2】:

    这可以通过使用一些中间件从SCRIPT_NAME 环境变量中删除脚本的名称来解决,如下面的示例取自Flask docs

    from yourapplication import app
    
    class ScriptNameStripper(object):
        def __init__(self, app):
            self.app = app
    
    def __call__(self, environ, start_response):
        environ['SCRIPT_NAME'] = ''
        return self.app(environ, start_response)
    
    app = ScriptNameStripper(app)
    

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      相关资源
      最近更新 更多