2

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

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

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


它工作正常,但是当我有一个使用现有文件夹的 url 时,例如:
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>

我一直在尝试修复它几个小时,但我看不到问题,希望您能提供帮助。

4

2 回答 2

0

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

RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ index.php?url=$1 [L]
于 2013-05-19T17:23:39.113 回答
0

我来寻找解决同样问题的方法,@Chris Hendry 的评论建议重写日志对调试非常有帮助。

不完全是,但您可以让它将重写操作记录到您可以遵循的日志中。RewriteLog "/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 重定向到“正确”位置。

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

DirectorySlash Off

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

于 2014-03-15T15:42:19.620 回答