lighttpd 未使用 uwsgi 模块定义环境变量 PATH_INFO

问题描述 投票:0回答:1

我在 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

事实上,

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?

python uwsgi bottle lighttpd
1个回答
0
投票

lighttpd 网关服务器主机选项

如果

"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"
?您在哪里找到或剪切粘贴的? (提示:无效)

© www.soinside.com 2019 - 2024. All rights reserved.