我的两个版本的网站(分别位于/ 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
。
整个配置已成为规则的意义,我需要以某种方式清理它们。
答案 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>取代。这也会减少$1
到www.example.com////<whatever>////<something>////
的请求。
然后,删除末尾的尾部斜杠(或任意数量的斜杠):
www.example.com/<whatever>/<something>/