将 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.rewrite
和 url.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
我需要将 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.rewrite
和 url.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=&"
)