我有一个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.php
而不是example.com/mysub/index.php
。
我猜这意味着$1
VirtualHost RewriteRule 不包含mysub
目录前缀?这是为什么?我想也许两个文件中的 RewriteBase(不同)是问题所在,但修改它并没有改变输出。
我认为问题出在 VirtualHost mod_rewrite 上。在另一台服务器(Centos 5)上,网站运行正常(尽管我没有使用 php-fpm)。我宁愿不修改 htaccess,因为它是第三方代码的一部分。
PHP 5.4;CentOS 7;Apache 2.4
编辑:当我将 htaccess Rewrites 移至 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>