PHP-FPM は htaccess では動作しません

PHP-FPM は htaccess では動作しません

私は以下を持っていますVirtualHost:

<VirtualHost *:80>
DocumentRoot "/var/www/html/example.com"
ServerName example.com
ServerAlias *.example.com
<Directory "/var/www/html/example.com">
    Require all granted
    Options -Indexes +FollowSymLinks -ExecCGI
    AllowOverride All
    DirectoryIndex index.php
    <IfModule mod_proxy_fcgi.c>
        RewriteEngine On
        RewriteBase /
        RewriteOptions InheritBefore        
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule ^([^\.]+\.php)$ fcgi://127.0.0.1:9000/var/www/html/example.com/$1 [L,P]
    </IfModule>
</Directory>
</VirtualHost>

そして、.htaccessにあるファイル/var/www/html/example.com/mysub/.htaccess。ファイル内には.htaccess次のものがあります:

Options -MultiViews
RewriteEngine On
RewriteBase /mysub

Options +FollowSymLinks

RewriteCond $1 !^(index\.php|assets|css|js|favicon\.ico|robots\.txt)

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

問題:example.comブラウザでに問題なく移動できます。ただし、 に移動しようとすると、ではなくexample.com/mysubが表示されます。example.com/index.phpexample.com/mysub/index.php

$1これは、VirtualHost の RewriteRule にディレクトリ プレフィックスが含まれていないことを意味すると思いますmysub。なぜでしょうか。両方のファイルの RewriteBase (異なる) が問題である可能性があると思いましたが、それを変更しても出力は変わりませんでした。

問題は VirtualHost の mod_rewrite にあると思います。別のサーバー (Centos 5) では、Web サイトは完全に動作します (ただし、php-fpm を使用していません)。htaccess はサードパーティ コードの一部であるため、変更したくありません。

PHP 5.4、CentOS 7、Apache 2.4

編集:htaccess の書き換えを VirtualHost ファイルに移動し、パスを / ベースで動作するように変更すると機能します。ただし、サードパーティのコードは変更された htaccess によっていつでも更新される可能性があるため、これは理想的ではありません。

答え1

Rewrite を VirtualHost の Directory ディレクティブの外側に移動すると、問題は解決しました。

<VirtualHost *:80>
DocumentRoot "/var/www/html/example.com"
ServerName example.com
ServerAlias *.example.com
<Directory "/var/www/html/example.com">
    Require all granted
    Options -Indexes -MultiViews +FollowSymLinks
    AllowOverride All
</Directory>
RewriteEngine On
RewriteOptions InheritBefore

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteCond $1 ^(.*\.php(/.*)?)$
RewriteRule ^(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1 [L,P]
</VirtualHost>

関連情報