将 nginx 转换为 lighttpd 重写规则

Convert nginx to lighttpd rewrite rule

我需要将 nginx 服务器更改为 lighttpd 服务器。 CMS 应该 运行 在支持 URL 重写的网络服务器上。下面提供了工作的 nginx 配置。问题是将 nginx 配置转换为 lighttpd 配置。

server {

        # The port to listen on
        listen 8086;

        # The host to listen on
        #server_name localhost

        # The root directory
        root /storage/emulated/0/htdocs/web/;

        # Enable directory listing
        #autoindex on;
        autoindex on;

        # Don't show any server tokens
        server_tokens off;

        # The default indexes to look for
        index  index.html index.htm index.php;


        location / { try_files $uri /index.php?$args; } 
        location /api/authorize { try_files $uri /api/authorize/index.php?args; } 
        location /api { try_files $uri /api/index.php?$args; } 
        location /install { try_files $uri /install/index.php?$args; } 
        location /maint { try_files $uri /maint/index.php?$args; } 
        location /maintenance { try_files $uri /index.php?$args; }

        }

我不太明白你的意思,但你可以尝试类似以下示例的 lighttpd 重写规则:

url.rewrite-once

在处理之前在网络服务器内部重写一组 URL。

例如

url.rewrite-once = ( "<regex>" => "<relative-uri>" )

或多个规则..

url.rewrite-once = ( 
  "<regex1>" => "<relative-uri1>",
  "<regex2>" => "<relative-uri2>" 
)
url.rewrite-repeat

在处理之前在网络服务器内部重写一组 URL

例如

url.rewrite-repeat = ( "<regex>" => "<relative-uri>" )

这些选项之间的区别在于,url.rewrite-repeat 允许连续应用多个(单独定义的)重写规则,url.rewrite-once 将导致跳过更多重写规则如果表达式匹配。因此,url.rewrite-once 的行为类似于 Apache 的 RewriteRule ... [L]: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule

选项 url.rewriteurl.rewrite-final 映射到 url.rewrite-once in 1.3.16.

url.rewrite-[repeat-]if-not-file

新:对于 1.4.x 从 1.4.24 或 svn 的 r2647 开始的分支:

在处理之前在网络服务器内部重写一组 URL,并检查文件是否不存在。

拿上面的例子来说,这是模仿Apache的“!-f”RewriteRule。请注意,这不适用于目录、管道、套接字等。

我想在哪里使用它?也许与例如Drupal 后端,其中 mod_magnet(具有 Apache 的 -f 和 -d 解决方案)可能不方便或只是 "too much" 仅用于此类重写。

正则表达式 模式 ("wildcards") 与字符串匹配 特殊字符(参考[http://www.regular-expressions.info/reference.html]):

  • 。 (句号)- 匹配任意字符
  • *(星号)- 匹配前一个符号的零个或多个
  • +(加号)-匹配一个或多个前面的符号
  • ? (问题)- 匹配前一个符号的零个或一个
  • \? (反斜杠什么的)- 匹配特殊字符
  • ^(插入符号)- 匹配字符串的开头
  • $(美元)- 匹配字符串的结尾
  • [set] - 匹配方括号内的任意一个符号。
  • [^set] - 匹配任何不在方括号内的符号。
  • (pattern) - 分组,记住pattern匹配的是什么作为特殊变量
  • {n,m} - 从 n 到 m 次匹配前一个字符(m 可以省略表示 >=n 次)
  • (?!expression) - 匹配当前位置的任何表达式。示例:“^(/(?!(favicon.ico$|js/|images/)).*)" => "/fgci/"l 正常的字母数字字符被视为正常 替换图案 如果匹配的正则表达式包含括号中的组,则替换中的 $1..$9 指的是捕获的文本 匹配组“$1”表示第一组,“$2”表示第二组,依此类推。

请注意,% 替换 (like %1, %2, %0, etc.)url.rewrite-* 目标中是允许的,但没有它们在 evhost.path 模式中的含义。如果 url.rewrite-* 在正则表达式条件中指定,则 % 模式将替换为条件正则表达式中的相应组。 %1 替换为第一个子表达式,%2 替换为第二个,依此类推。 %0 替换为与正则表达式匹配的整个子字符串。请参阅下面的示例,使用“%0”。

例子 正则表达式与用户提供的完整 REQUEST_URI 相匹配,包括

查询字符串。

# the following example, is, however just simulating vhost by rewrite
# * you can never change document-root by mod_rewrite
# use mod_*host instead to make real mass-vhost

server.document-root = "/www/htdocs/" 
$HTTP["host"] =~ "^.*\.([^.]+\.com)$" {
  url.rewrite-once = ( "^/(.*)" => "/%0/" )
}

# request:        http://any.domain.com/url/ 
# before rewrite: REQUEST_URI="/www/htdocs/url/" 
# and DOCUMENT_ROOT="/www/htdocs/" %0="any.domain.com" ="url/" 
# after rewrite:  REQUEST_URI="/www/htdocs/any.domain.com/url/" 
# still, you have DOCUMENT_ROOT=/www/htdocs/

# please note, that we have two regular expressions: the one which 
# $HTTP["host"] is been compared with, and the one of the rewrite  rule.
# the numbered subexpressions available to build the relative uri are
# being prefixed by '%' for subexpressions of the first regular expression 
# match and by '$' for subexpressions of the second one.
# subexpression 0 interpolates the whole matching string: %0 for the whole
# string matching the conditional, and [=15=] for the whole string matching the
# rewrite rule.

# if the rewrite rule is not included in a conditional 
# block, only the '$' prefixed variables are available.

url.rewrite-once = ( "^/id/([0-9]+)$" => "/index.php?id=",
                     "^/link/([a-zA-Z]+)" => "/index.php?link=" )

mod_redirect 重写规则总是在重定向规则之前执行。无论模块加载的顺序或配置中规则的顺序如何(lighttpd v1.4.13)都是如此。但是,mod_rewrite 提供了一种机制来通过 unmangled 传递 URL:指定“[=34=]”作为规则目标,但要确保规则匹配整个字符串,因为 [=34=] 是整个匹配的字符串.

例如

url.rewrite-once = (
    "^/foo"  => "[=16=]",
    "^/(.*)" => "/handler/" 
)

url.redirect = (
    "^/foo"  => "http://foo.bar/" 
 )

从 1.4.40 版本开始,另一种方法是为重写规则指定一个空白目标。这将导致匹配的规则保持 url 不变,并将跳过任何进一步的重写规则。

url.rewrite-once = (
    "^/foo"  => "",   # instead of (nonsensical) blank url, the url  will not be modified
    "^/(.*)" => "/handler/" 
)

Windows 上 "File name too long" 的解决方法 当 运行 Lighttpd 在 Windows 上时,如果计算的文件名超过 255 个符号,您可能会收到 500 Internal Server Error。 在错误日志中,它将是 (response.c.537) 文件未找到 ... 左右:文件名太长 /very_looooong_path ->。 作为解决方法,您可以使用 mod_rewrite 来避免此错误。

server.modules += ("mod_rewrite")
url.rewrite-once = ( ".{250,}" => "/toolong.php" )

如果错误处理程序是 PHP,$_SERVER['REQUEST_URI'] 将包含完整的 URI。

传递/匹配查询字符串(GET variables) 如果您想将查询字符串 (?foo=bar) 传递到重写目标,您必须显式匹配它:

url.rewrite-once = (
"^/news/([^\?]+)(\?(.*))?" => "/news.php?title=&" 
)

Documentation