![Apache/mod_wsgi 中的 URL 长度问题](https://linux22.com/image/676956/Apache%2Fmod_wsgi%20%E4%B8%AD%E7%9A%84%20URL%20%E9%95%BF%E5%BA%A6%E9%97%AE%E9%A2%98.png)
我有一个 python wsgi API,用于处理不同长度的传入 URL 负载。我相信,但并不完全确定,我可能遇到了 URL 大小的限制。
对于特定有效负载(> 6K 个字符),它在本地使用 Python Web 服务器运行良好,但当我将其移动到 Apache(在 OS X 和 RHEL 6 上)时,浏览器会显示 404 错误。根据我所看到的,如果有效负载过大,我应该会收到 413 或 414 错误。请注意,对于比这更短的 URL,我在 Apache 中运行它们没有问题。
我仔细检查了 Apache 日志,发现只有“未找到目标 WSGI 脚本或无法统计”这个错误。我用 Google 搜索到的所有与这个错误相关的信息都表明存在应用程序错误,而且如上所述,我知道我的 wsgi 配置是有效的。但它似乎只是在处理较大的 URL 时会失效,这让我认为这可能是 mod_wsgi 的问题。
我的 VirtualHost 配置是:
<VirtualHost *:80>
Alias /cardiocatalogqt /Library/WebServer/extjs/cardioCatalogQT
<Location /cardiocatalogqt>
Order deny,allow
Allow from all
</Location>
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess rest_api user=gregsilverman threads=5
WSGIScriptAlias /api /Library/WebServer/wsgi/rest_api/rest_api.wsgi
WSGIPassAuthorization On
<Location /api>
Order deny,allow
Allow from all
</Location>
</VirtualHost>
除了缩短 URL 之外的任何建议都非常受欢迎。
答案1
这不是 WSGI 的问题,你也无能为力。我已经分析了这个问题。Apache 使用 libapr 库,并调用apr_filepath_merge
在某个时候执行的函数
if (maxlen > APR_PATH_MAX) {
return APR_ENAMETOOLONG;
}
在APR_PATH_MAX
Unix 中,PATH_MAX
该值为 4096。任何大于 4096 的 URL 都将触发此错误。然后在ap_core_translate
(apache 源代码文件中的第 4734 行server/core.c
)中返回HTTP_BAD_REQUEST
。