apache 2.4, mod_proxy_fcgi не соблюдает.htaccess, необходимо обойти
Я использую Apache 2.4.7 с mod_proxy_fcgi с целью передачи через php в php-fpm (это будет использоваться для среды общего хостинга). Htaccess отлично работает для файлов не php, но как только он попадет в правило перезаписи, которое проксирует запросы php, htaccess игнорируется.
Я знаю, почему это происходит. Вопрос: как мне обойти это?
Вопрос, как заставить Apache обработать запрос к файлу php как запрос к локальному файлу, а затем прокси?
Я потратил много времени на исследование этой проблемы, и в качестве решения были приведены следующие "ответы":
1) "использовать конфигурацию apache вместо.htaccess" - это правильное решение, но не для среды общего хостинга (я не собираюсь предоставлять доступ к конфигурации apache клиентам общего хостинга;)).
2) "не используйте.htaccess, так как он имеет проблемы с производительностью / безопасностью / другими проблемами", а как еще клиенты общего хостинга могли бы контролировать перезапись доступа / URL на своем сайте? Кроме того, если.htaccess не был требованием, я бы просто использовал nginx.
3) "поставить правило перезаписи для прокси внутри" - это неверно и не работает.
Это поведение, по-видимому, не ошибка, а "особенность" в соответствии с https://issues.apache.org/bugzilla/show_bug.cgi?id=54887
5 ответов
РЕДАКТИРОВАТЬ:
Реальное решение этой проблемы - не помещать правило перезаписи для прокси в php-fpm, а делать следующее:
RewriteCond %{REQUEST_URI} -U
RewriteRule (.*\.php)$ fcgi://IP:PORT/$1 [P,L]
Снаружи тегов и внутри тегов.
В оригинальном решении возникла проблема: если был "RewriteEngine On" или какие-либо связанные с "RewriteRule" правила / условия, это привело бы к тому, что Apache полностью игнорировал бы правила перезаписи внутри тегов в основном конфигурационном файле.
Ниже не совсем правильно
Я обнаружил, что был неправ из-за того, что не работал внутри тега.
RewriteMap and standard rewrite lookup of the user dirs goes here
<Directory /PATH_TO_WWW/*>
Standard directory conf goes here
RewriteRule ^(.*\.php)$ fcgi://IP_OF_THE_FPM:FPM_PORT/$1 [P,L]
</Directory>
В основном секрет (по крайней мере, для меня), мне нужно было поместить правило перезаписи, которое проксирует внутри тегов каталогов, предназначенных для общего каталога пользователей с *.
поэтому, если у меня есть пользователи в /var/www/$username, тег каталога должен выглядеть следующим образом:
TL; DR: использовать правило перезаписи прокси внутри тегов каталога для каталога общих пользователей.
Между тем, начиная с Apache 2.4.10, доступна еще одна опция: прокси через обработчик. Смотрите пример в документации Apache: примеры mod_proxy_fcgi
Вы также можете принудительно обработать запрос как запрос обратного прокси-сервера, создав подходящий проход для обработчика. В приведенном ниже примере конфигурации все запросы на сценарии PHP передаются на указанный сервер FastCGI с использованием обратного прокси-сервера. Эта функция доступна в Apache HTTP Server 2.4.10 и более поздних версиях. Из соображений производительности вы захотите определить работника, представляющего один и тот же fcgi:// backend. Преимущество этой формы состоит в том, что она позволяет нормальному отображению URI и имени файла происходить на сервере, а результат локальной файловой системы передается бэкэнду. Когда FastCGI настроен таким образом, сервер может рассчитать наиболее точный PATH_INFO.
<Proxy "fcgi://localhost/">
ProxySet enablereuse=On
</Proxy>
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://localhost:9000"
</FilesMatch>
Это позволяет использовать RewriteRules и аутентификацию в файлах.htaccess. После того, как все переписывание сделано, запрос передается в php-fpm.
Помните, что RewriteCond -U проверит правильность URI перед выполнением фактического перенаправления, следовательно, удваивая каждый запрос! это может серьезно повлиять на производительность, особенно на сайтах с высокой нагрузкой.
Я предлагаю проверить "RewriteOptions InheritBefore", который, кажется, решает любую проблему, связанную с наследованием htaccess, как описано здесь:
Понимание apache 2.4 mod_proxy_fcgi и RewriteRules в htaccess
Ура, Джорджио
Похоже, вы передаете все свои php-запросы вашему быстрому cgi-серверу, который не знает, как использовать htaccess, поэтому он игнорирует эти файлы. Если вам нужно использовать файлы htaccess от Apache, то вам нужно выполнять php-скрипты с помощью Apache (т.е. используя mod_php) вместо передачи выполнения другому сервису, который не имеет представления о htaccess.
Вы можете пересмотреть правила переписывания, но так как они контролируются пользователем, вы ничего не можете с этим поделать.
Я думаю, что это самый чистый метод, без каких-либо уродливых переписываний в конфигурации Apache:
<VirtualHost IP:80>
ServerName domain.tld
ServerAlias www.domain.tld
DocumentRoot /var/www/project/web
<FilesMatch \.php$>
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>
<Directory /var/www/project/web>
AllowOverride All
</Directory>
</VirtualHost>