我有一个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>
还有位于/var/www/html/example.com/mysub/.htaccess的.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.php而不是example.com/mysub/index.php 。
我假设这意味着VirtualHost RewriteRule中的$1不包含mysub目录前缀? 这是为什么? 我想也许两个文件中的RewriteBase(不同)是问题,但修改它并没有改变输出。
我相信这个问题是在VirtualHost mod_rewrite。 在不同的服务器上(Centos 5),该网站完美的工作(虽然我不使用php-fpm)。 我不想修改htaccess,因为它是第三方代码的一部分。
PHP 5.4; CentOS 7; Apache 2.4
编辑:它将工作时,我将htaccess重写到VirtualHost文件,并修改path与基地的/。 这是不理想的,虽然因为第三方代码可以在任何时候修改htaccess更新。
将重写移到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>