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>
Другие вопросы по тегам