0

在将 apache .htaccess 中看似简单的重写规则转换为 lighttpd 规则时遇到了一些麻烦。

阿帕奇规则: RewriteRule (.*) index.php?baseURL=$1 [L,QSA]

本质上,整个 URL 是作为baseURL参数传递的,当然任何其他给定的参数都会被保留。

一个警告是它应该只适用于单个目录,并且(希望)不要将该目录包含在baseURL.

目前我在 lighttpd 中拥有的是:

url.rewrite-once = (
"^\/Folder\/(.*)" => "/Folder/index.php?baseURL=$0"
)

这将获取整个 url 并将其作为参数传递,包括\Folder\和参数,因此http://domain/Folder/test.php?someParam=1使baseURL包含/Folder/test.php?someParam=1

我可以在 php 中解析它并使其工作,但关键是在 apache 和 lighttpd 中具有相同的 php 代码。

4

1 回答 1

2

你有几个问题。$0是整个匹配,你想$1引用第一个子匹配, (.*). 像这样:

url.rewrite-once = (
    "^/Folder/(.*)" => "/Folder/index.php?baseURL=$1"
)

这仍然有查询字符串的问题,它会产生两个?s. 例如

"/Folder/foo?bar=1" => "/Folder/index.php?baseURL=foo?bar=1" 

最终解决方案:

url.rewrite-once = (
    # Match when there are no query variables
    "^/Folder/([^\?]*)$" => "/Folder/index.php?baseURL=$1",
    # Match query variables and append with &
    "^/Folder/([^\?]*)\?(.*)$" => "/Folder/index.php?baseURL=$1&$2",
)
于 2013-10-28T21:13:50.853 回答