У меня в разделе виртуального хоста есть следующее:
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/local.mysite/wordpress/$1
В ходе тестирования я обнаружил, что добавление правила перезаписи RewriteRule ^/wordpress/wp-content/(.*)$ /wp-content/$1 [L]
не оказало никакого эффекта для URL-адреса следующего вида:
http://local.mysite/wordpress/wp-content/plugins/simple-post-thumbnails/timthumb.php?src=....
Это потому, что все запросы, содержащие .php
это имя, передаются в fcgi, и поэтому все правила перезаписи игнорируются?
решение1
Если вы используете proxypassmatch или proxypass, он передает скрипт php для обработки процессом php-fpm, а процесс php-fpm игнорирует правила .htaccess. Один из способов избежать этого — использовать apache sethandler, как объясняется в этом ответеhttps://serverfault.com/a/672969/189511,
<FilesMatch \.php$>
SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
</FilesMatch>
Я скопирую сюда полное решение.
После нескольких часов поиска и чтения документации Apache я нашел решение, которое позволяет использовать пул, а также позволяет директиве Rewrite в .htaccess работать даже в том случае, если URL содержит файлы .php.
<VirtualHost ...> ... # This is to forward all PHP to php-fpm. <FilesMatch \.php$> SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/" </FilesMatch> # Set some proxy properties (the string "unique-domain-name-string" should match # the one set in the FilesMatch directive. <Proxy fcgi://unique-domain-name-string> ProxySet connectiontimeout=5 timeout=240 </Proxy> # If the php file doesn't exist, disable the proxy handler. # This will allow .htaccess rewrite rules to work and # the client will see the default 404 page of Apache RewriteCond %{REQUEST_FILENAME} \.php$ RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f RewriteRule (.*) - [H=text/html] </VirtualHost>
Согласно документации Apache, для параметра прокси SetHandler требуется Apache HTTP Server 2.4.10.
Надеюсь, это решение поможет и вам.