Назад | Перейти на главную страницу

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

Между тем, начиная с Apache 2.4.10 доступен еще один вариант: прокси через обработчик. См. Пример в документации Apache: Примеры mod_proxy_fcgi

Вы также можете принудительно обработать запрос как запрос обратного прокси, создав подходящий сквозной обработчик. В приведенном ниже примере конфигурации все запросы сценариев PHP будут передаваться на указанный сервер FastCGI с использованием обратного прокси. Эта функция доступна в Apache HTTP Server 2.4.10 и новее. По соображениям производительности вы захотите определить воркер, представляющий тот же бэкэнд fcgi: //. Преимущество этой формы заключается в том, что она позволяет выполнять обычное отображение 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>

РЕДАКТИРОВАТЬ:

Настоящее решение этой проблемы - не вводить правило перезаписи прокси в 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: используйте правило перезаписи прокси внутри тегов каталога для каталога обычных пользователей.