Mod Rewrite 在重写规则中附加文档根目录

Mod Rewrite 在重写规则中附加文档根目录

以前我的主机提供商提供了在 apache 配置文件中设置重写规则的选项。当时下面的规则运行良好。

# Non WWW URLs to WWW URLs
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]

现在我正在移动所有这些规则,并且在每个重定向中,它都会像在 URL 中.htaccess一样添加文档根目录。/var/www/sites...

为什么这种表现会有所不同?

答案1

mod_rewrite在 htaccess 文件中的行为有所不同。在文档中,它记录了这一事实。

If you wish to match against the full URL-path in a per-directory (htaccess) RewriteRule, use the %{REQUEST_URI} variable in a RewriteCond.

答案2

您很可能需要指定一个RewriteBase如果您从文件中使用 mod_rewrite .htaccess

答案3

Richard Salts 对你所需要的东西有所提示。我刚刚自己解决了这个问题。

Apache 文档对于这里的含义有点含糊:

If you wish to match against the full URL-path in a per-directory (htaccess) RewriteRule, use the %{REQUEST_URI} variable in a RewriteCond.

它们的意思是在 RewriteRule 之前使用 RewriteCond 进行匹配,然后在 RewriteRule 的替换中使用 RewriteCond 中的占位符变量(替换指的是 URL 将被重写为的内容;它是 RewriteRule 指令中的第二个参数)。

要引用 RewriteRule 之前执行的最后一个 RewriteCond 中的占位符,请使用 %N 而不是 $N。以下是您的解决方案:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule ^(.*)$ http://www.example.com%1 [R=301,L]

相关内容