为什么RewriteRule仅适用于不存在的文件?

时间:2012-06-01 02:29:03

标签: apache .htaccess mod-rewrite

这是一个常见的问题,并且有许多常见的答案,但我有一个特定的小细节不起作用,阅读文档并没有帮助我理解原因。

所以,问题是:我想从域名中删除www.。我将.htaccess与mod_rewrite一起使用。这是代码:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.swedish\-cloud\.com$
RewriteRule ^(.*)$ "http\:\/\/swedish\-cloud\.com\/$1" [R=301,L]

如果我只输入http://www.swedish-cloud.com,它就可以了。它将其更改为http://swedish-cloud.com

但是,如果我输入,例如:http://www.swedish-cloud.com/index.html,则将网址更改为http://swedish-cloud.com/index.html

但是,如果我键入指向不存在文件的路径,例如http://www.swedish-cloud.com/index2.html,则会将网址更改为http://swedish-cloud.com/index2.html,显示 404 Not Found 错误。

你能告诉我我错过了什么吗?谢谢。

PS:我没有对服务器的root访问权限。

2 个答案:

答案 0 :(得分:1)

让我们给你正确的答案。您的cond语法错误但不显着,规则的语法也是错误的。尝试:

RewriteCond %{HTTP_HOST} =www.swedish-cloud.com
RewriteRule ^.*          http://swedish-cloud.com/$0   [R=301,L]

如果您想要这样做,请在cond中使用相等运算符,然后您不需要转义匹配字符串。

替换字符串不需要引号或转义,因为您需要整个URI,为什么不使用$ 0(整个匹配模式)。

答案 1 :(得分:0)

您看到的404错误是标准错误。 重写的原因不适用于www.example.com/something.html是因为它与正则表达式不匹配,因为你拥有行尾锚。 swedish-cloud.com $之后的$。这意味着www.swedish-cloud.com将被重写后,因为你基本上已经终止了正则表达式。

尝试:

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