使用uwsgi模块的lighttpd未定义环境变量PATH_INFO
我在Alpine Linux上运行的是lighttpd版本1.4.73。我启用了mod_scgi
,并在我的配置文件中添加了以下内容:
scgi.protocol = "uwsgi"
scgi.server = (
"/tp2/" => ( "tp2-app" => (
"host" => "127.0.0.1",
"port" => 8080,
"check-local" => "disable",
"fix-root-scriptname" => "enable",
"fix_root_path_name" => "enable"
)
),
)
我的Bottle.py程序崩溃了,因为找不到PATH_INFO
。我把问题简化成了一个非常小的纯Python wsgi应用,它显示请求的环境变量:
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain;charset=utf-8')])
page = [f'@Hello World!\n'.encode("utf-8")]
for key, value in environ.items():
page.append(f"{key} = {value}\n".encode("utf-8"))
return sorted(page)
我用以下命令运行这个应用:
uwsgi --uwsgi-socket 127.0.0.1:8080 --plugin python3 -w hello_world_app
确实,lighttpd没有设置PATH_INFO
:
HTTP/1.1 200 OK
Content-Type: text/plain;charset=utf-8
Accept-Ranges: bytes
Content-Length: 943
Date: Sun, 24 Mar 2024 18:22:09 GMT
Server: lighttpd/1.4.73
@Hello World!
CONTENT_LENGTH = 0
DOCUMENT_ROOT = /var/www/localhost/htdocs
GATEWAY_INTERFACE = CGI/1.1
HTTP_ACCEPT = */*
HTTP_HOST = tp2.test
HTTP_USER_AGENT = curl/8.5.0
QUERY_STRING = date=2024-03-24T14:22:10-04:00
REDIRECT_STATUS = 200
REMOTE_ADDR = 192.168.3.10
REMOTE_PORT = 35690
REQUEST_METHOD = GET
REQUEST_SCHEME = http
REQUEST_URI = /tp2/hello?date=2024-03-24T14:22:10-04:00
SCRIPT_FILENAME = /var/www/localhost/htdocs/tp2/hello
SCRIPT_NAME = /tp2/hello
SERVER_ADDR = 192.168.3.30
SERVER_NAME = tp2.test
SERVER_PORT = 80
SERVER_PROTOCOL = HTTP/1.1
SERVER_SOFTWARE = lighttpd/1.4.73
uwsgi.node = b'tp2.test'
uwsgi.version = b'2.0.23'
我该如何将所有在路径/tp2/
下的请求转发到我的应用,并让Bottle能够使用PATH_INFO
呢?
1 个回答
如果设置了 "check-local" => "disable"
,那么 lighttpd 就不会检查文档根目录下的文件系统中的 URL,也不会生成 PATH_INFO
。这里的 PATH_INFO
是指 URL 路径中脚本名称之后的部分,而 lighttpd 被告知不要检查本地文件系统,而是将请求中的整个 URL 路径视为 SCRIPT_NAME
。
PATH_INFO
: https://www.rfc-editor.org/rfc/rfc3875.html#section-4.1.5
如果你使用 "check-local" => "disable"
,那么你的脚本应该关注的是发出的请求,而不是 PATH_INFO
。比如,你可以查看 SCRIPT_NAME
和 QUERY_STRING
,或者是 lighttpd 提供的非标准 REQUEST_URI
,它包含了 SCRIPT_NAME
、可选的 PATH_INFO
和 QUERY_STRING
。
实际的解决办法是:如果你从配置中去掉 "check-local" => "disable"
,然后在你的 server.document-root
下创建一个名为 tp2
的空文件,那么 PATH_INFO
可能会按照你想要的方式生成。
(另外,你也可以修复你的 uwscgi 应用程序,使其不依赖于 PATH_INFO
,这样就可以保留 "check-local" => "disable"
。)
"fix-root-scriptname" => "enable"
是用于处理 "/"
(路径的根)的情况,这不适用于 "/tp2/"
,所以在你的配置中似乎没有任何效果。
"fix_root_path_name" => "enable"
是什么?你在哪里找到这个或者复制粘贴的?(提示:这个设置是无效的)