我刚刚搬到Vagrant,建立了LAMP堆栈,到目前为止我真的很高兴。我遇到的唯一问题是mod_rewrite。我已经确认mod_rewrite已经打开,它正在为重定向工作。
以下代码在我的vhost文件中:
<VirtualHost *:80>
ServerName devserver.local
DocumentRoot /var/www/public_html
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/vagrant_dev-error.log
LogLevel warn
CustomLog /var/log/apache2/vagrant_dev-access.log combined
</VirtualHost>
然后我在.htaccess文件中有以下内容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^tools'/([a-zA-Z_]+)'.json$ tools.php?tool=$1 [QSA,L]
</IfModule>
基本上,我是如何"过去工作"的http://www.devserver.local/tools/test_function.json它重写为http://www.devserver.local/tools.php?tool=test_function
现在我正在流浪,它加载tools.php,但没有查询字符串tool
(例如:http://www.devserver.local/tools.php)。这几乎就像有一些配置允许PHP文件在没有PHP.的情况下运行
如果我将tools.php重命名为tools-test.php并将.htaccess更新为:,我就可以让它正常工作
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^tools'/([a-zA-Z_]+)'.json$ tools-test.php?tool=$1 [QSA,L]
</IfModule>
因此,它检测到tools.php退出并在运行我的.htaccess文件之前加载该文件。
我不认为这是一个特别的Vagrant问题,它可能只是Apache或mod_rewrite中的一个设置,我需要打开/关闭或配置。以前有人经历过这种情况吗?
解决方案
正如Jon Lin在下面提到的,这是MultiViews
打开的问题。我选择在我的vhosts文件中禁用它,而不是Jon建议直接从.htaccess禁用它。两者都有效。
<VirtualHost *:80>
ServerName devserver.local
DocumentRoot /var/www/public_html
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/vagrant_dev-error.log
LogLevel warn
CustomLog /var/log/apache2/vagrant_dev-access.log combined
</VirtualHost>
这听起来像是一个多新闻问题。多视图是mod_negotification的一部分,它试图"猜测"URL可以映射到的资源。因此,当它在URL中看到/tools/
并看到文件/tools.php
时,它会直接将请求映射到php文件,从而完全绕过mod_rewrite。
尝试将此添加到您的htaccess文件:
Options -Multiviews