2017-02-12 50 views
0

我有以下我的我的网站的两个版本.htaccess配置(在/ oldsite和/ newsite分别):301重定向规则打破以往的规矩

RewriteEngine On 

# load newsite if not newsite and not oldsite 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^((?!(?:newsite|oldsite)).*)$ newsite/$1 [NC,L] 

# load root if request is oldsite 
RewriteRule ^oldsite(/.*)?$ /$1 [L,NC] 

# certain urls need to be loaded in page.php 
RewriteRule ^newsite/(products|services|news|pages)/([a-zA-Z0-9_.-/]+)$ /newsite/page.php?type=$1&var=$2 

#remove trailing .php 
RewriteRule ^newsite/([a-zA-Z0-9_-]+)$ /newsite/$1.php [NC,L,QSA] 
RewriteRule ^newsite/admin/([a-zA-Z0-9_-]+)$ /newsite/admin/$1.php [NC,L,QSA] 

我现在想做一个散装301重定向所有对www的非www请求,还有一个301重定向到非结尾的斜杠url。例如:

  • www.example.com/// - >www.example.com
  • example.com///// - >www.example.com
  • www.example.com/somepage// - >www.example.com/somepage

我尝试添加在不同位置处的以下在.htaccess

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

但是这破坏了以前的规则。例如输入example.com导致www.example.com/newsite

整个配置已成为规则的意大利面条,我需要以某种方式清理它们。

回答

0

您的非www到www重定向应该在您的.htaccess文件的最顶端。否则,触发内部重写的非www主机的请求(例如到newsite/$1)可能会转换为重定向,这似乎是此处发生的情况(当您重定向到www.example.com/newsite时)。作为一般规则,重定向应该总是在重写之前出现。那么应该没有冲突。

www.example.com/// - >www.example.com

严格地说总有1个斜杠的主机名的末尾(或者更确切地说,在开始的URL路径的),它只是浏览器通常会在地址栏中省略它。这与URL路径的末尾的斜线不同,可以完全省略。

# Remove multiple slashes anywhere in the URL-path 
RewriteCond %{THE_REQUEST} //+ 
RewriteRule (.*) /$1 [R=301,L] 

RewriteCond指令简单地检查多个斜线在(所述初始请求的)的URL路径的任何地方。然后,重定向依赖于以下事实:Apache自动截取与RewriteRule模式匹配的URL路径中的多个斜线,并在替换中使用此($1反向引用)。这也将减少www.example.com////<whatever>////<something>////www.example.com/<whatever>/<something>/的请求。

然后,在年底(或任意数量的尾随斜线)删除尾随斜线:

# Remove trailing slash(es) 
RewriteRule (.*)/$ /$1 [R=301,L] 
+0

重定向的作品,但把像'example.com ///'不删除尾随斜杠。它把我带到我的404页面。输入你建议的更改后,以下是我的整个配置:http://pastebin.com/U6aVmJC7 – Chris

+0

该指令_应该已经去除了'example.com ///'后面的斜杠。确保您的浏览器缓存清除。(如上所述,您仍然需要原始www重定向到您的脚本顶部)。我已经更新了我的答案,以允许更普遍的方案 - 在URL中减少_anywhere_的斜杠。就你的服务器而言,请求是针对'example.com /'还是'example.com ///' - 它们都解决了同样的问题。 'example.com /'产生404吗?根据你的指令,这将被重写为'/ newsite /' - 这是否有效? – MrWhite