Apache vhost重写与现有文件夹出错

时间:2013-05-19 17:16:30

标签: php apache .htaccess rewrite vhosts

我希望我的虚拟主机重写网址,例如:
http://dev.example.com/cool/story/bro

要:
http://dev.example.com/index.php?url=cool/story/bro

除非指定现有文件,例如:
http://dev.example.com/images/duck.png


它工作正常,但当我有一个使用现有文件夹的网址,如:
http://dev.example.com/images

奇怪地重定向到:
http://dev.example.com/images/?url=images

何时应改写为:
http://dev.example.com/index.php?url=images


这是我目前的代码:

<VirtualHost *:80>
        ServerName dev.example.com
        DocumentRoot /var/www/dev/public

        php_flag display_errors 1
        php_value error_reporting 30719

        <Directory "/var/www/dev/public">
                RewriteBase /
                RewriteEngine On
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteRule ^(.*)$ index.php?url=$1 [L]
        </Directory>
</VirtualHost>

我一直在努力修复它几个小时,但我看不出问题,希望你能提供帮助。

2 个答案:

答案 0 :(得分:0)

除了现有文件之外,您还要为现有目录指定RewriteCond。

RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ index.php?url=$1 [L]

答案 1 :(得分:0)

我来寻找这个问题的解决方案,而@Chris Hendry的评论暗示重写日志在调试时非常有帮助。

  

不完全是,但您可以将重写操作记录到您可以遵循的日志中。 RewriteLog&#34; /path/to/file/rewrite.log" RewriteLogLevel 3 httpd.apache.org/docs/2.2/mod/mod_rewrite.html#RewriteLogLevel - Chris Hendry

我将问题跟踪到Apache,在没有它的情况下请求文件夹时自动添加尾部斜杠,如下所示:https://stackoverflow.com/questions/13354238#answer-13354276

Apache看到已经请求了一个目录,并导致301重定向到&#34;更正&#34;位置。

当我将此指令添加到我的.htaccess文件时(在您的情况下,它应该在vhost本身中工作),我已经解决了这个问题:

DirectorySlash Off

修改:确保在再次测试之前清除缓存。 301重定向是缓存。