我在虚拟主机部分有以下内容:
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 文档后,我找到了一个解决方案,它允许使用池,并且即使 url 包含 .php 文件,也允许 .htaccess 中的 Rewrite 指令起作用。
<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。
我希望这个解决方案也能帮助您。