我正在运行 lighttpd 1.4.33,它是从向 Internet 开放的 Apache 服务器反向代理的。当从 lighttpd 服务器的本地地址访问脚本时,GET 参数可以正常传递给脚本,并且我得到了预期的结果。但是,当通过代理访问脚本(并由以下 lighttpd 规则重写)时,查询参数似乎被完全删除。
似乎导致问题的重写规则:
$HTTP["host"] =~ "^site\.example\.com$" {
# This affects the requests that aren't rewritten below, ie. static stuff
server.document-root = "/var/www/example/public"
url.rewrite-once = ( "^((?!assets).)*$" => "index.php/$1" )
}
它应该重写所有 URL,以便它们通过 index.php 中的路由引擎传递,但/assets
目录中的静态内容除外,这些内容应该以静态方式提供。请注意,/assets
是的子目录/var/www/example/public
,因此它可以正常工作。
带有丢弃参数的请求的 Lighttpd 调试日志:
2014-07-23 11:36:46: (response.c.310) Request-URI : /foo/bar?someparam=data
2014-07-23 11:36:46: (response.c.311) URI-scheme : http
2014-07-23 11:36:46: (response.c.312) URI-authority: site.example.com
2014-07-23 11:36:46: (response.c.313) URI-path : /foo/bar
2014-07-23 11:36:46: (response.c.314) URI-query : someparam=data
2014-07-23 11:36:46: (response.c.309) -- splitting Request-URI
2014-07-23 11:36:46: (response.c.310) Request-URI : index.php/a
2014-07-23 11:36:46: (response.c.311) URI-scheme : http
2014-07-23 11:36:46: (response.c.312) URI-authority: site.example.com
2014-07-23 11:36:46: (response.c.313) URI-path : index.php/a
2014-07-23 11:36:46: (response.c.314) URI-query :
请注意最后一行的空白URI-query
字段。似乎“拆分请求 URI”这一步骤破坏了一切。
您知道这可能是什么原因造成的吗?
答案1
事实证明,在 lighttpd >= 上有一个更简单的方法可以做到这一点1.4.24
。你可以使用url.rewrite-if-not-file
指令,如下所示 (lighttpd <= 1.4.33
):
$HTTP["host"] =~ "^site\.example\.com$" {
# Rewrite all requests to non-physical files
url.rewrite-if-not-file =
(
"^(.*)$" => "index.php/$1"
)
}
该示例使用指令$HTTP["host"]
,就像使用$HTTP["url"]
指令直到1.4.34
在 lighttpd >= 中1.4.34
,您可以在 URL 条件块中使用它:
$HTTP["url"] =~ "^\/site/$" {
# Rewrite all requests to non-physical files
url.rewrite-if-not-file =
(
"^(.*)$" => "index.php/$1"
)
}
我想如果你真的被迫使用 lighttpd <= 1.4.24
,您始终可以使用 mod_magnet 和 Lua。