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

2 ответа

Решение

Установка переменной среды HTTP_AUTHORIZATION ("CGI") должна происходить как часть настройки CGI (заголовки передаются как HTTP_...), и lighttpd НЕ исключает заголовок "Авторизация" из этого, так что здесь ничего не нужно делать в lighttpd.

Конфигурация перезаписи переписывает все запросы, не нацеленные на статические файлы или каталоги в /api/ субтрасса. Ближайший в lighttpd (1.4.24+) без использования mod_magnet было бы:

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

Это также сработает для каталогов (только обычные файлы не перезаписываются), но я думаю, что маловероятно, что вам на самом деле нужны перехваты в пределах /api/ путь, так что это, вероятно, хорошо.

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

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

  2. Фронт-контроллер - все запросы, которые не отображаются в существующие файлы (или каталоги), внутренне переписываются в /api/index.php, Это стандартный "шаблон фронт-контроллера".

Так что, по сути, приведенный выше код является просто стандартным фронт-контроллером, который направляет все запросы /api/index.php,

и переписать его на основе конфигурации lighttpd

К сожалению, я не говорю на lighttpd, но Google lighttpd front controller подтягивает некоторые возможности. Например, с этой страницы, если включены необходимые модули, они предлагают вам сделать что-то вроде:

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

Хотя это не похоже на то, что фактически проверяет наличие запрошенного файла, а скорее предполагает, что запросы на файлы будут иметь расширение файла (моя интерпретация).

Другие вопросы по тегам