我在 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"
)
),
)
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
事实上,
PATH_INFO
不是由lighttpd设置的:
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/
下的所有内容转发到我的应用程序并让 PATH_INFO
可用于 Bottle?
如果
"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"
并触摸 tp2
下名为 server.document-root
的空文件,那么 PATH_INFO
可能会按照您想要的方式生成。
(或者,修复您的 uwscgi 应用程序以不依赖
PATH_INFO
,您可以保留 "check-local" => "disable"
)
"fix-root-scriptname" => "enable"
适用于 scgi.server
正在处理 "/"
(路径的根),这不适用于 "/tp2/"
,因此这似乎对您的配置没有任何影响。
什么是
"fix_root_path_name" => "enable"
?您在哪里找到或剪切粘贴的? (提示:无效)