Назад | Перейти на главную страницу

Перенести правило заголовка авторизации Apache в Lighttpd

На моем веб-сервере уже много лет работают приложения 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, если у него есть поддержка.

Я хотел бы понять, что он делает

  1. Он устанавливает переменную среды с именем HTTP_AUTHORIZATION к стоимости Authorization Заголовок HTTP-запроса (если есть). Это может быть необязательно в конфигурации вашего сервера. PHP должен устанавливать это автоматически, однако, в зависимости от того, как PHP установлен в некоторых конфигурациях Apache, этого не происходит - отсюда и этот фрагмент кода. (Обратите внимание, что приведенный выше код пытается установить это двумя разными способами - но конечный результат "почти" тот же.)

  2. Передний контроллер - все запросы, которые не соответствуют существующим файлам (или каталогам), внутренне переписываются в /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/ путь, так что, вероятно, все в порядке.