【问题标题】:apache rewritten URL contains full Linux pathapache 重写的 URL 包含完整的 Linux 路径
【发布时间】:2014-09-05 02:32:18
【问题描述】:

我正在尝试在 .htaccess 文件中使用以下 Apache 重写规则来去除 URL 的尾部斜杠。我在各个论坛的多个主题中都看到了这个解决方案:

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

这是导致 URL 的原因

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”,则会在 apache 日志中记录 301,但不会发生重写。

这是该域的虚拟主机条目:

<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>

对可能发生的事情有什么建议吗?

【问题讨论】:

  • 你找到解决办法了吗?

标签: linux apache .htaccess url mod-rewrite


【解决方案1】:

看起来 mod_rewrite 将文件路径误认为是 URI 路径。尝试在规则的目标中添加前导斜杠:

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

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

RewriteCond %{REQUEST_FILENAME} !-d

【讨论】:

  • 感谢您的回复。在 $1 之前放置一个斜线并没有解决它。 URI 字符串仍然被转换为文件系统路径。
  • @dcorsello 确保您已清除缓存,因为它是 301,您的浏览器会缓存它。
【解决方案2】:

以下作品:

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

【讨论】:

  • 我使用宏,因此无法对域进行硬编码。我使用RewriteRule ^(.*) https://%{HTTP_HOST}/$1 并重定向到https://example.com/var/www/full/path/
猜你喜欢
  • 1970-01-01
  • 2018-03-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2017-12-10
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多