将Apache授权标头规则迁移到Lighttpd

我的Web服务器使用lighttpd和PHP-FPM运行PHP应用程序多年。 现在,在第三方软件升级之后,我必须包含一些规则才能激活REST API。

<IfModule mod_setenvif.c> SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 </IfModule> <IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteBase /api/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* index.php [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] </IfModule> 

我想知道它在做什么,如果它有支持的话,可以基于lighttpdconfiguration重写它。

设置HTTP_AUTHORIZATION(“CGI”)环境variables应该作为CGI设置的一部分(头文件被作为HTTP_...传递),并且lighttpd不会从这里排除“Authorization”-header,所以在lighttpd 。

重写configuration将重写所有不针对/api/子path中的静态文件或目录的请求。 在不使用mod_magnet情况下,在lighttpd( 1.4.24+ )中最接近的是:

 url.rewrite-if-not-file = ( "^/api/" => "/api/index.php" ) 

这也将触发目录(只有普通的文件不会被重写),但我认为你实际上不需要在/api/path中使用diristings,所以这可能是好的。

我想了解它在做什么

  1. 它将称为HTTP_AUTHORIZATION的环境variables设置为Authorization HTTP请求标头(如果有的话)的值。 这可能不需要在您的服务器configuration。 PHP应该自动设置这个,但是,取决于如何在某些Apacheconfiguration上安装PHP,这不会发生 – 因此这一点代码。 (请注意,上面的代码尝试以两种不同的方式来设置 – 但最终的结果几乎是一样的。)

  2. 前端控制器 – 所有未映射到现有文件(或目录)的请求在内部被重写为/api/index.php 。 这是一个标准的“前端控制器模式”。

所以,基本上,上面的代码只是一个标准的前端控制器,将所有的请求引导到/api/index.php

并根据lighttpdconfiguration重写它

不幸的是,我不说lighttpd,但谷歌的lighttpd front controller拉出一些可能性。 例如, 从这个页面 ,提供必要的模块已启用,他们build议你可以做这样的事情:

 url.rewrite-once = ( "^/(.*)\.(.*)" => "$0", "^/([^.]+)$" => "/index.php", "^/$" => "/index.php" ) 

虽然这看起来不像是实际检查所请求的文件的存在,而是假设对文件的请求将具有文件扩展名(我的解释)。