我在带有IIS和wfastCGI的Windows2016Server上使用Python3.10.4和Flask。
为了进行测试,我将Python脚本简化到了最低限度:
from flask import Flask, request, abort, render_template
from functools import wraps
app = Flask(__name__, static_url_path='/dwapi')
app.config["APPLICATION_ROOT"] = "/dwapi"
@app.route("/dwapi")
def dwapi_index():
return "Invalid URL Path"
@app.route("/dwapi/myroute/<startdate>/<propertyid>")
def get_data(startdate,propertyid):
return "xxx"
if __name__ == "__main__":
app.run()当我使用URL时:
http://myservdwiis/dwapi/myroute/2021-8-01/80712,80804它工作-浏览器显示"xxx“。
然后我使用这个更长的URL:
http://myservdwiis/dwapi/myroute/2021-8-01/80712,80804,53009,80602,80519,80517,80802,38025,80705,80514,80515,80516,80807,38026,80808,20001,38400,51022,51023,80522,38027,32010,80527,54130,54131,38456,38017,80520,80521,80528,80805,38018,80523,80524,08030,56120,56121,56122,56123,56124,98145,98142,98143,981它返回:
Bad Request - Invalid URL
HTTP Error 400. The request URL is invalid如果我从上面的URL中删除一个字符,它就能工作。
http://myservdwiis/dwapi/myroute/2021-8-01/80712,80804,53009,80602,80519,80517,80802,38025,80705,80514,80515,80516,80807,38026,80808,20001,38400,51022,51023,80522,38027,32010,80527,54130,54131,38456,38017,80520,80521,80528,80805,38018,80523,80524,08030,56120,56121,56122,56123,56124,98145,98142,98143,98这将返回它应该返回的"xxx“。
这看起来不应该太长。IIS中没有设置任何限制(我可以看到)--它具有默认的2048限制。但上面只有306个字符,包括主机名和协议。
是什么限制了这一点,还是因为其他原因?
当我在我的Windows 10系统上(而不是通过IIS或wfastCGI )本地运行这个程序时,它没有这个问题。。
发布于 2022-11-21 03:18:06
除了iis设置之外,还可以设置注册表项以告知HTTP.sys允许更长的URL。默认情况下,HTTP.sys允许255个段的最大长度为每个260个字符。260个字符限制是造成这一问题的原因。
您可以在注册表中更改该设置。一旦您重新启动,url将工作。
登记处:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters]
"UrlSegmentMaxLength"=dword:00000400这将有效地将段长设置为1024。
更多信息,您可以参考这个链接:对长Url的响应400 (不良请求)。
https://stackoverflow.com/questions/74483997
复制相似问题