Почему path_info не работает с FastCGI на Apache 2.4?

Вопрос или проблема

У меня настроен сервер Apache для запуска PHP для некоторых веб-сайтов и Perl CGI-скриптов для других. Однако, Perl-скрипты плохо работают во время индексации поисковыми системами и вызывают проблемы.

Я пытаюсь перенести Perl CGI на Fast CGI.

Вот конфигурация CGI для сайта:

ScriptAlias /bar "/home/foo/bar/index.cgi"

Вот что я пытаюсь сделать с помощью Fast CGI. Это использует spawn_fcgi для запуска приложения.

SetEnvIf Request_URI "^/bar(.*)" PATH_INFO=$1
ProxyPassMatch ^/bar(/|$)(.*) fcgi://127.0.0.1:9001/home/foo/bar/index.cgi/$2
ProxyPassReverse /bar(/|$)(.*) fcgi://127.0.0.1:9001/home/foo/bar/index.cgi

Проблема в том, что path_info и script_name() на CGI::Fast дают мне странные ответы. Я вижу дублированные компоненты или остальную часть пути в режиме CGI:Fast, но в режиме CGI со Script Alias все работает нормально.

Я подозреваю, что директива ProxyPass тут неверна. Без строки SetEnvIf path_info пустой.

Я передавал script_name в HTML::Template, и это генерирует недействительные ссылки в режиме FCGI, но в CGI все в порядке. path_info также иногда не совпадает для маршрутизации. Так на /bar у меня есть несколько других конечных точек, которые отображают разные страницы в рамках одного скрипта, например, /bar/view1, /bar/view2 и так далее.

Ответ или решение

Проблема, с которой вы столкнулись при использовании FastCGI с Apache 2.4, связана с некорректной обработкой переменной PATH_INFO. Это может вызвать сбои в работе веб-приложений, например, тех, которые написаны на Perl и используют библиотеку CGI::Fast. Рассмотрим подробно, почему это происходит и как можно решить проблему.

Техническое объяснение проблемы

  1. Обработка PATH_INFO и SCRIPT_NAME: В CGI-среде переменные PATH_INFO и SCRIPT_NAME автоматически определяются сервером. PATH_INFO обычно содержит дополнительный путь, переданный вместе с URL, а SCRIPT_NAME — путь к скрипту. Однако при использовании FastCGI, особенно в сочетании с Apache и модулями вроде мод_proxy_fcgi, эти переменные могут быть определены некорректно.

  2. Ошибка в проксировании URI: В вашей конфигурации проксирования используется ProxyPassMatch. Здесь важно корректно настроить регулярное выражение, чтобы правильно отделять и передавать части URI к FastCGI-приложению. Ошибка в этих настройках может привести к дублированию компонентов в PATH_INFO или SCRIPT_NAME.

Решение проблемы

  1. Корректировка конфигурации Apache:

    SetEnvIf Request_URI "^/bar(/|$)(.*)" PATH_INFO=$1
    ProxyPassMatch ^/bar(/|$)(.*)$ fcgi://127.0.0.1:9001/home/foo/bar/index.cgi/$2
    ProxyPassReverse /bar(/|$)(.*)$ fcgi://127.0.0.1:9001/home/foo/bar/index.cgi

    Обратите внимание на изменение $ на конец регулярного выражения. Это поможет правильно определять конец линии и избегать дублирования компонентов пути.

  2. Использование альтернативных методов: Рассмотрите использование модулей mod_rewrite для более гибкого управления маршрутизацией URL. Например, вы можете использовать правила переписывания для корректной обработки путей.

  3. Тестирование и отладка: Используйте инструменты чтения логов и отладки (например, Apache Error Log) для отслеживания реальной обработки запросов. Это поможет вам понять, как Apache и FastCGI интерпретируют ваши переменные.

Заключение

Перевод CGI-скриптов на FastCGI может существенно улучшить производительность, но требует тщательной настройки. Правильная настройка Proxy и SetEnvIf директив — ключевые шаги для успешной миграции. Надеемся, эти рекомендации помогут вам устранить проблемы с PATH_INFO и улучшить работоспособность вашего приложения.

SEO-оптимизация

Статья предоставляет детальное руководство по решению распространенной проблемы с PATH_INFO на Apache, что делает её полезной для IT-специалистов, сталкивающихся с подобными задачами при работе с FastCGI и миграцией скриптов.

Оцените материал
Добавить комментарий

Капча загружается...