Vagrant上的mod_rewrite问题

时间:2014-11-04 02:38:12

标签: php apache .htaccess mod-rewrite

我刚刚转向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>

因此它会在运行我的.htaccess文件之前检测到tools.php退出并加载该文件。

我不认为这是一个特别的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>

1 个答案:

答案 0 :(得分:1)

这听起来像是一个多视图问题。多视图是mod_negotiation的一部分,并尝试猜测&#34; URL可以映射到的资源。因此,当它在URL中看到/tools/并且它看到文件/tools.php时,它会直接将请求映射到php文件,从而完全绕过mod_rewrite。

尝试将此添加到您的htaccess文件中:

Options -Multiviews