我试图实施2条规则
1)强迫www。
我的工作是
RewriteCond %{HTTP_HOST} ^domain.com
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]
2)在所有网址上添加尾随正斜杠 我通过这样做得到了这个目标
RewriteCond %{HTTP_HOST} ^domain.com
RewriteRule (.*) http://www.domain.com/$1/ [R=301,L]
然后我遇到了一个问题,
输入网址
1) www.domain.com --rewrites to--> http://www.domain.com/ ---Desired Result
2) domain.com --rewrites to--> http://www.domain.com// ---Undesired Result
3) domain.com/location1 --rewrites to--> http://www.domain.com/location1/ ---Desired Result
4) www.domain.com/location1 --rewrites to--> http://www.domain.com/location1 ---Undesired Result
我如何编写它以便让这两条规则有效?
答案 0 :(得分:1)
此规则将重定向所有访问而不使用www:
RewriteCond %{HTTP_HOST} ^domain.com
RewriteRule (.*) http://www.domain.com$1 [R=301]
看到我删除了标志,使其成为最后一条规则。
和第二个放置斜杠:
RewriteRule (.*[^/])$ $1/ [R=301,L]
当URL已经以斜线结尾时,它不会重定向。当有人访问没有www且没有斜线的页面时,您将获得2次重定向。如果你只是想通过搜索引擎这样做,那很好。如果您自己的网站经常指向这样的网址,则需要另一个正则表达式。
如果SEO是您的动机,请查看canonical URLs
答案 1 :(得分:0)
尝试在www部分之前添加斜杠部分 - 应该可以正常工作。
答案 2 :(得分:0)
我从未使用过这个指令,但有两种想法可能会有所帮助:
您的原始模式不会排除已经以斜杠结尾的网址。我认为你需要一个更像
的模式^ domain.com。* [^ /]
否则以斜杠结尾的网址会传递,因此会添加另一个斜杠。
为什么要更改主机名以添加“www”?如果请求进入您的服务器,那么有或没有www,它就成功了,那你为什么要关心?如果请求没有发送到您的服务器,那么当然,您的规则永远不会被应用。我在想,也许你的例子过于简单,也许在现实生活中你会重定向到另一台服务器。但在那种情况下,你为什么要关心原来的主机名呢?只需填写您需要的主机名。
为什么要添加斜杠?如果名称原来是一个目录,Apache服务器会自动添加斜杠。您不能拥有同名文件和目录,因此最多只会更改not-founds上的错误消息。