.htaccess 让Flask在mod rewrite之后使用所需的URL
我有一个Flask应用程序在Apache上的mod_wsgi下运行。由于网站的各个部分是静态的,而其他部分是动态的,因此使用.htaccess 让Flask在mod rewrite之后使用所需的URL,.htaccess,url,mod-rewrite,flask,mod-wsgi,.htaccess,Url,Mod Rewrite,Flask,Mod Wsgi,我有一个Flask应用程序在Apache上的mod_wsgi下运行。由于网站的各个部分是静态的,而其他部分是动态的,因此使用mod_rewrite将网站的动态部分路由到Flask应用程序,如下所示: .htaccess RewriteEngine on RewriteBase / RewriteRule ^(foo(/.*)?)$ /myapp.wsgi/$1 [L,QSA] RewriteRule ^(bar(/.*)?)$ /myapp.wsgi/$1 [L,QSA] #
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/
页面告诉我我的URL是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/
)我不知道自己是否理解得很好,但您可能希望使用url\u实现此处记录的函数:
它允许您通过引用应用程序的端点来构造URL。
例如('bar')的url\u
将构造指向bar端点的相对url。这可以通过使用一些中间件从script\u name
环境变量中删除脚本名称来解决,如下例取自
这是一个选项,尽管当flask本身提供重定向时,这并没有帮助。e、 g.当URL缺少尾随斜杠时,Flask会自动重定向到带有尾随斜杠的URL。我已经用这个更新了这个问题。你可以通过使用route
中的strict\u slashes
参数来删除斜杠重定向行为,但我承认它并没有真正解决这个问题。您是否尝试过在配置中设置应用程序根目录application.config.udpate(application\u ROOT=“myapp.wsgi”)
我已尝试将application\u ROOT
设置为myapp.wsgi
,但这似乎确保了当前的行为。我还尝试将其设置为/
和www.mywebsite.com
,以及将SERVER\u NAME
设置为www.mywebsite.com
,但都不起作用。
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)