Apache의 ProxyPassMatch가 규칙 재작성보다 우선합니까?

Apache의 ProxyPassMatch가 규칙 재작성보다 우선합니까?

virtualhost 섹션에 다음이 있습니다.

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이 필요합니다.

이 솔루션이 귀하에게도 도움이 되기를 바랍니다.

관련 정보