我正在将Flask部署在需要使用CGI服务的共享服务器上。我已经能够使用以下.htaccess代码从网址中删除文件名:
AddHandler cgi-script .cgi .pl
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /home/tetra/public_html/cgi-bin/tetra.cgi/$1 [L]
但是,每当我使用url_for()生成链接时,它都会将cgi-bin文件路径重新插入到链接中,因此https://servername/auth/login
变为https://servername/cgi-bin/app.cgi/auth/login
。
当我从网址中删除cgi-bin/app.cgi/
时,该网址可以正常工作。在搜索此问题时,我看到CGIRootFix可以通过从URL中删除文件路径来解决此问题:
http://werkzeug.pocoo.org/docs/0.14/contrib/fixers/
我尝试将其添加到我的CGI文件中:
from werkzeug.contrib.fixers import CGIRootFix
app = CGIRootFix(app,app_root='/')
完整文件:
#!<path redacted>
#path to python packages
import sys
sys.path.insert(0, '<path redacted>')
from wsgiref.handlers import CGIHandler
from myapp import app
from werkzeug.contrib.fixers import CGIRootFix
app = CGIRootFix(app,app_root='/')
if __name__ == '__main__':
CGIHandler().run(app)
这确实解决了生成的URL帽子url_for()的问题,我可以通过命令行从flask shell进行测试:
>>> from flask import url_for
>>> url_for('main.index')
'http://servername/'
>>> url_for('auth.login')
'http://servername/auth/login'
但是...现在访问URL会导致404错误。没有任何页面使用任何URL加载,无论是所需URL还是包含文件名的URL。这肯定是一个愚蠢的配置问题,但是文档和我在此问题上发现的其他问题一样,都有些薄。
我还尝试了app.wsgi_app = CGIRootFix(app.wsgi_app,app_root='/')
和以前见过的线程的其他一些变化。
您知道我使用CGIRootFix时是什么导致404的吗?如何使它加载具有所需URL的页面?
答案 0 :(得分:0)
我从来没有想过如何使此修复程序起作用,但是,我认为可能是因为这是一个过时的解决方案。我可以通过对代码进行以下更改来修复链接:
将app.config['_external']=True
添加到配置中,然后在.cgi文件中,在应用执行行之前添加os.environ['SCRIPT_NAME']=""
。您也可以将SCRIPT_NAME=""
添加到站点的配置中,并且仅在还设置了_external的情况下,它才有效。最终结果是它不起作用并且我的URL是正确的。
真的希望这可以帮助处于相同情况的其他人。