Apache 的 ProxyPassMatch 能否勝過重寫規則?

Apache 的 ProxyPassMatch 能否勝過重寫規則?

我在虛擬主機部分有以下內容:

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-fpm 進程處理的 php 腳本,並且 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。

我希望這個解決方案也能幫助您。

相關內容