定义了一个 post 请求函数用来删除服务器上的文件
app.py 代码如下
@app.route('/omaewamoushindeiru?filename=<string:filename>', methods=['POST'])
def delete(filename):
imgname = UPLOADER + '/' + filename
thumbname = UPLOADER + '/thumb_' + filename
os.remove(imgname)
os.remove(thumbname)
flash('删除成功')
return redirect(url_for('index'))
index.html 代码如下
{% for pic in pics %}
<!-- 略 -->
<form method="post" action="{{ url_for('delete', filename=pic) }}">
<input class="btn" type="submit" value="删除" onclick="return confirm('Are you sure?')">
</form>
<!-- 略 -->
{% endfor %}
在本地(windows)运行时可正常通过 post 删除文件并重定向到首页
同样代码部署到服务器上则请求直接返回 404
搞不清楚原因,有哪位可以指点一下吗?
找到原因了,自问自答一下,引以为戒。
感谢 @sobright 提醒我查看日志,逐步定位并解决了问题。
首先我发现 gunicorn 没有打印我发起的 post 请求的记录,说明请求是在 nginx 层就被处理并返回 404了。于是我又去看了 nginx 的网站日志,竟然也没有发现请求记录,再查看 nginx 配置文件时发现了这么一段
原来 nginx 没记录是因为我 post 请求的地址是
由于上面的规则被 nginx 没有将 .jpg 结尾的请求记录写入日志文件,同时因为这个请求地址中的 ? = 被转义成了 %3F %3D,服务器把整个地址当成图片地址去找文件,没找到于是返回 404
本地没有这个问题是因为本地不需要用 nginx 做端口转发,没有涉及到 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ 这个规则