301重定向规则打破了以前的规则

时间:2017-02-12 17:56:30

标签: php apache .htaccess redirect

我的两个版本的网站(分别位于/ oldsite和/ newsite)有以下.htaccess配置:

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]

我现在想要对www的所有非www请求进行批量301重定向,并且还要301重定向到非尾随斜杠网址。例如:

  • 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

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

1 个答案:

答案 0 :(得分:0)

您的非www到www重定向应该位于.htaccess文件的最顶层。否则,触发内部重写的非www主机(例如newsite/$1)的请求可能会转换为重定向,这似乎是这里发生的事情(当您被重定向到{{1}时) })。作为一般规则,重定向应始终在重写之前。那时应该没有冲突。

  

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

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

www.example.com

# Remove multiple slashes anywhere in the URL-path RewriteCond %{THE_REQUEST} //+ RewriteRule (.*) /$1 [R=301,L] 指令只检查URL路径(初始请求)中的任何位置的多个斜杠。然后,重定向依赖于Apache自动截断与RewriteCond 模式匹配的URL路径中的多个斜杠并在<中使用此RewriteRule反向引用)的事实。 EM>取代。这也会减少$1www.example.com////<whatever>////<something>////的请求。

然后,删除末尾的尾部斜杠(或任意数量的斜杠):

www.example.com/<whatever>/<something>/