我的 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>
我想了解它在做什么,并且如果它有支持的话,根据 lighttpd 配置重写它。
答案1
设置 HTTP_AUTHORIZATION(“CGI”)环境变量应该作为 CGI 设置的一部分(标头作为传递HTTP_...
),并且 lighttpd 不会从中排除“Authorization”标头,因此在 lighttpd 中无需执行任何操作。
重写配置会重写所有不针对子路径中的静态文件或目录的请求。lighttpd ( )/api/
中最接近的配置是:1.4.24+
mod_magnet
url.rewrite-if-not-file = ( "^/api/" => "/api/index.php" )
这也会触发目录(只有常规文件不会被重写),但我认为您实际上不太可能需要路径内的目录列表/api/
,所以这可能没问题。
答案2
我想了解它在做什么
它会将一个名为的环境变量设置
HTTP_AUTHORIZATION
为 HTTP 请求标头的值Authorization
(如果有)。这可能不是您服务器配置所必需的。PHP 应该会自动设置它,但是,根据 PHP 在某些 Apache 配置上的安装方式,这种情况不会发生 - 因此需要这段代码。(请注意,上述代码尝试以两种不同的方式设置它 - 但最终结果“几乎”相同。)前端控制器 - 所有未映射到现有文件(或目录)的请求均在内部重写为
/api/index.php
。这是标准的“前端控制器模式”。
因此,基本上,上面的代码只是一个将所有请求定向到的标准前端控制器/api/index.php
。
并根据lighttpd配置重写
不幸的是,我不会使用 lighttpd,但谷歌搜索后lighttpd front controller
找到了一些可能的方法。例如,从此页面,只要启用了必要的模块,他们建议您可以执行以下操作:
url.rewrite-once = ( "^/(.*)\.(.*)" => "$0", "^/([^.]+)$" => "/index.php", "^/$" => "/index.php" )
虽然,这看起来并不像它实际上检查所请求文件是否存在,而是假设文件请求将具有文件扩展名(我的解释)。