apache重写的URL包含完整的Linux路径

时间:2014-07-15 02:32:07

标签: linux apache .htaccess url mod-rewrite

我试图在.htaccess文件中使用以下Apache重写规则来从URL中删除尾部斜杠。我已在各种论坛的许多主题中看到过这个解决方案:

RewriteRule ^(.*)/$ $1 [L,R=301]

这会导致网址

http://www.domain.com/widgets/

被重写为

http://www.domain.com/usr/local/www/apache22/data/domain/widgets

RewriteRule之前有许多显式301重定向,然后是其他重写条件和规则,但即使它是.htaccess文件中唯一的语句,也会发生同样的事情。

我的linux服务器和XAMPP服务器上都出现了这个问题。在Windows中,URL被重写为

http://www.domain.com/C:/xampp/htdocs/domain/widgets

如果我删除" L"根据规则,301会记录在apache日志中,但不会重写。

此处是此域的vhost条目:

<VirtualHost X.X.X.X:80>
    ServerAdmin admin@domain.com
    DocumentRoot "/usr/local/www/apache22/data/domain"
    ServerName www.domain.com
    ErrorLog "/var/log/apache22/domain-error.log"
    CustomLog "/var/log/apache22/domain-access.log" combined
    <Directory /usr/local/www/apache22/data/domain>
        AllowOverride FileInfo
    </Directory>
    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresDefault "access plus 1 week"
        ExpiresByType text/html "access plus 1 week"
        ExpiresByType image/gif "access plus 1 week"
        ExpiresByType image/jpeg "access plus 1 week"
        ExpiresByType image/png "access plus 1 week"
        ExpiresByType text/css "access plus 1 week"
        ExpiresByType text/javascript "access plus 1 week"
        ExpiresByType application/x-javascript "access plus 1 week"
        ExpiresByType text/xml "access plus 1 week"
    </IfModule>
</VirtualHost>

有关可能发生的事情的任何建议吗?

2 个答案:

答案 0 :(得分:0)

看起来mod_rewrite错误地使用URI路径的文件路径。尝试在规则的目标中添加前导斜杠:

RewriteRule ^(.*)/$ /$1 [L,R=301]

但是,请记住,mod_dir和DirectorySlash指令(默认情况下已打开)会将所有缺少尾部斜杠的目录/文件夹的请求重定向到带有斜杠的同一URL,并且此规则将创建重定向循环。您可以通过在规则之前包含条件来规避这一点:

RewriteCond %{REQUEST_FILENAME} !-d

答案 1 :(得分:0)

以下作品:

RewriteRule ^(.*)/$ http://www.domain.com/$1 [R=301,L]