Вопрос или проблема
У меня настроен сервер 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. Рассмотрим подробно, почему это происходит и как можно решить проблему.
Техническое объяснение проблемы
-
Обработка PATH_INFO и SCRIPT_NAME: В CGI-среде переменные PATH_INFO и SCRIPT_NAME автоматически определяются сервером. PATH_INFO обычно содержит дополнительный путь, переданный вместе с URL, а SCRIPT_NAME — путь к скрипту. Однако при использовании FastCGI, особенно в сочетании с Apache и модулями вроде мод_proxy_fcgi, эти переменные могут быть определены некорректно.
-
Ошибка в проксировании URI: В вашей конфигурации проксирования используется
ProxyPassMatch
. Здесь важно корректно настроить регулярное выражение, чтобы правильно отделять и передавать части URI к FastCGI-приложению. Ошибка в этих настройках может привести к дублированию компонентов в PATH_INFO или SCRIPT_NAME.
Решение проблемы
-
Корректировка конфигурации 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
Обратите внимание на изменение $ на конец регулярного выражения. Это поможет правильно определять конец линии и избегать дублирования компонентов пути.
-
Использование альтернативных методов: Рассмотрите использование модулей
mod_rewrite
для более гибкого управления маршрутизацией URL. Например, вы можете использовать правила переписывания для корректной обработки путей. -
Тестирование и отладка: Используйте инструменты чтения логов и отладки (например,
Apache Error Log
) для отслеживания реальной обработки запросов. Это поможет вам понять, как Apache и FastCGI интерпретируют ваши переменные.
Заключение
Перевод CGI-скриптов на FastCGI может существенно улучшить производительность, но требует тщательной настройки. Правильная настройка Proxy и SetEnvIf директив — ключевые шаги для успешной миграции. Надеемся, эти рекомендации помогут вам устранить проблемы с PATH_INFO и улучшить работоспособность вашего приложения.
SEO-оптимизация
Статья предоставляет детальное руководство по решению распространенной проблемы с PATH_INFO на Apache, что делает её полезной для IT-специалистов, сталкивающихся с подобными задачами при работе с FastCGI и миграцией скриптов.