На моем веб-сервере уже много лет работают приложения PHP с lighttpd и PHP-FPM. Теперь, после обновления стороннего программного обеспечения, я должен включить некоторые правила, чтобы активировать 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, если у него есть поддержка.
Я хотел бы понять, что он делает
Он устанавливает переменную среды с именем HTTP_AUTHORIZATION
к стоимости Authorization
Заголовок HTTP-запроса (если есть). Это может быть необязательно в конфигурации вашего сервера. PHP должен устанавливать это автоматически, однако, в зависимости от того, как PHP установлен в некоторых конфигурациях Apache, этого не происходит - отсюда и этот фрагмент кода. (Обратите внимание, что приведенный выше код пытается установить это двумя разными способами - но конечный результат "почти" тот же.)
Передний контроллер - все запросы, которые не соответствуют существующим файлам (или каталогам), внутренне переписываются в /api/index.php
. Это стандартный «шаблон переднего контроллера».
Итак, по сути, приведенный выше код - это просто стандартный фронт-контроллер, который направляет все запросы на /api/index.php
.
и перепишем на основе конфигурации lighttpd
К сожалению, я не говорю на lighttpd, но погуглил lighttpd front controller
подтягивает некоторые возможности. Например, с этой страницы, при условии, что необходимые модули включены, они предлагают сделать что-то вроде:
url.rewrite-once = ( "^/(.*)\.(.*)" => "$0", "^/([^.]+)$" => "/index.php", "^/$" => "/index.php" )
Хотя это не похоже на то, что на самом деле он проверяет наличие запрошенного файла, а скорее предполагает, что запросы файлов будут иметь расширение файла (моя интерпретация).
Установка переменной среды HTTP_AUTHORIZATION ("CGI") должна происходить как часть настройки CGI (заголовки передаются как HTTP_...
), и lighttpd НЕ исключает из этого заголовка "Авторизация", так что здесь в lighttpd делать нечего.
Конфигурация перезаписи перезаписывает все запросы, не нацеленные на статические файлы или каталоги в /api/
подпуть. Ближайший по lighttpd (1.4.24+
) без использования mod_magnet
было бы:
url.rewrite-if-not-file = ( "^/api/" => "/api/index.php" )
Это также сработает для каталогов (только обычные файлы не перезаписываются), но я думаю, что маловероятно, что вам действительно нужны dirlistings внутри /api/
путь, так что, вероятно, все в порядке.