尝试使用htaccess重定向网站时“重定向太多”

时间:2022-11-25 11:18:23

I need to redirect my site from example.net to www.example.net with a 301 redirect.

我需要通过301重定向将我的网站从example.net重定向到www.example.net。

I'm using All In One WP Security & Firewall for my website and it's automatically adding additional code inside my .htaccess file. The redirect is not working and I think this is caused by that extra code. The error I see in my browser is:

我正在为我的网站使用All In One WP安全和防火墙,它会自动在我的.htaccess文件中添加其他代码。重定向不起作用,我认为这是由额外的代码引起的。我在浏览器中看到的错误是:

Too many redirects occurred trying to open www.example.net.

尝试打开www.example.net时发生了太多重定向。

Will All In One WP Security & Firewall generates such error?

一体化WP安全和防火墙会产生这样的错误吗?

My 301 code:

我的301代码:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^example.net [NC]
RewriteRule ^(.*)$ www.example.net/$1 [L,R=301,NC]

All in One code:

一体化代码:

# BEGIN All In One WP Security
#AIOWPS_BLOCK_WP_FILE_ACCESS_START
<Files license.txt>
order allow,deny
deny from all
</files>
<Files wp-config-sample.php>
order allow,deny
deny from all
</Files>
<Files readme.html>
order allow,deny
deny from all
</Files>
#AIOWPS_BLOCK_WP_FILE_ACCESS_END
#AIOWPS_BASIC_HTACCESS_RULES_START
<Files .htaccess>
order allow,deny
deny from all
</Files>
ServerSignature Off
LimitRequestBody 10240000
<Files wp-config.php>
order allow,deny
deny from all
</Files>
#AIOWPS_BASIC_HTACCESS_RULES_END
#AIOWPS_PINGBACK_HTACCESS_RULES_START
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
#AIOWPS_PINGBACK_HTACCESS_RULES_END
#AIOWPS_DISABLE_INDEX_VIEWS_START
Options -Indexes
#AIOWPS_DISABLE_INDEX_VIEWS_END
#AIOWPS_IP_BLACKLIST_START
Order allow,deny
Allow from all
#AIOWPS_IP_BLACKLIST_END
#AIOWPS_DISABLE_TRACE_TRACK_START
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
#AIOWPS_DISABLE_TRACE_TRACK_END
#AIOWPS_FORBID_PROXY_COMMENTS_START
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{HTTP:VIA}%{HTTP:FORWARDED}%{HTTP:USERAGENT_VIA}%{HTTP:X_FORWARDED_FOR}%{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION}%{HTTP:HTTP_PC_REMOTE_ADDR}%{HTTP:HTTP_CLIENT_IP} !^$
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteRule .* - [F,NS,L]
#AIOWPS_FORBID_PROXY_COMMENTS_END
#AIOWPS_DENY_BAD_QUERY_STRINGS_START
RewriteCond %{QUERY_STRING} tag=     [NC,OR]
RewriteCond %{QUERY_STRING} ftp:     [NC,OR]
RewriteCond %{QUERY_STRING} http:    [NC,OR]
RewriteCond %{QUERY_STRING} https:   [NC,OR]
RewriteCond %{QUERY_STRING} mosConfig [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR]
RewriteCond %{QUERY_STRING} (\;|'|\"|%22).*(request|insert|union|declare|drop) [NC]
RewriteRule ^(.*)$ - [F,L]
#AIOWPS_DENY_BAD_QUERY_STRINGS_END
#AIOWPS_ADVANCED_CHAR_STRING_FILTER_START
<IfModule mod_alias.c>
RedirectMatch 403 \,
RedirectMatch 403 \:
RedirectMatch 403 \;
RedirectMatch 403 \=
RedirectMatch 403 \@
RedirectMatch 403 \[
RedirectMatch 403 \]
RedirectMatch 403 \^
RedirectMatch 403 \`
RedirectMatch 403 \{
RedirectMatch 403 \}
RedirectMatch 403 \~
RedirectMatch 403 \"
RedirectMatch 403 \$
RedirectMatch 403 \<
RedirectMatch 403 \>
RedirectMatch 403 \|
RedirectMatch 403 \.\.
RedirectMatch 403 \%0
RedirectMatch 403 \%A
RedirectMatch 403 \%B
RedirectMatch 403 \%C
RedirectMatch 403 \%D
RedirectMatch 403 \%E
RedirectMatch 403 \%F
RedirectMatch 403 \%22
RedirectMatch 403 \%27
RedirectMatch 403 \%28
RedirectMatch 403 \%29
RedirectMatch 403 \%3C
RedirectMatch 403 \%3E
RedirectMatch 403 \%3F
RedirectMatch 403 \%5B
RedirectMatch 403 \%5C
RedirectMatch 403 \%5D
RedirectMatch 403 \%7B
RedirectMatch 403 \%7C
RedirectMatch 403 \%7D
# COMMON PATTERNS
Redirectmatch 403 \_vpi
RedirectMatch 403 \.inc
Redirectmatch 403 xAou6
Redirectmatch 403 db\_name
Redirectmatch 403 select\(
Redirectmatch 403 convert\(
Redirectmatch 403 \/query\/
RedirectMatch 403 ImpEvData
Redirectmatch 403 \.XMLHTTP
Redirectmatch 403 proxydeny
RedirectMatch 403 function\.
Redirectmatch 403 remoteFile
Redirectmatch 403 servername
Redirectmatch 403 \&rptmode\=
Redirectmatch 403 sys\_cpanel
RedirectMatch 403 db\_connect
RedirectMatch 403 doeditconfig
RedirectMatch 403 check\_proxy
Redirectmatch 403 system\_user
Redirectmatch 403 \/\(null\)\/
Redirectmatch 403 clientrequest
Redirectmatch 403 option\_value
RedirectMatch 403 ref\.outcontrol
# SPECIFIC EXPLOITS
RedirectMatch 403 errors\.
RedirectMatch 403 config\.
RedirectMatch 403 include\.
RedirectMatch 403 display\.
RedirectMatch 403 register\.
Redirectmatch 403 password\.
RedirectMatch 403 maincore\.
RedirectMatch 403 authorize\.
Redirectmatch 403 macromates\.
RedirectMatch 403 head\_auth\.
RedirectMatch 403 submit\_links\.
RedirectMatch 403 change\_action\.
Redirectmatch 403 com\_facileforms\/
RedirectMatch 403 admin\_db\_utilities\.
RedirectMatch 403 admin\.webring\.docs\.
Redirectmatch 403 Table\/Latest\/index\.
</IfModule>
#AIOWPS_ADVANCED_CHAR_STRING_FILTER_END
#AIOWPS_BLOCK_SPAMBOTS_START
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} ^(.*)?wp-comments-post\.php(.*)$
RewriteCond %{HTTP_REFERER} !^http(s)?://example\.net\.au [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule .* http://127.0.0.1 [L]
</IfModule>
#AIOWPS_BLOCK_SPAMBOTS_END
#AIOWPS_PREVENT_IMAGE_HOTLINKS_START
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g?|png)$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://example\.net\.au [NC]
RewriteRule \.(gif|jpe?g?|png)$ - [F,NC,L]
</IfModule>
#AIOWPS_PREVENT_IMAGE_HOTLINKS_END
# END All In One WP Security

2 个解决方案

#1


The problem is with

问题在于

RewriteRule ^(.*)$ www.example.net/$1 [L,R=301,NC]

www.example.net is taken as a relative path and not as a different domain.

www.example.net被视为相对路径而不是不同的域。

This is the reason, why it rewrites the URL http://example.net/some/path to http://example.net/www.example.net/some/path, which again is rewritten to http://example.net/www.example.net/www.example.net/some/path and so on.

这就是为什么它将URL http://example.net/some/path重写为http://example.net/www.example.net/some/path的原因,它再次被重写为http:// example .net / www.example.net / www.example.net / some / path等。

If you want to rewrite from domain example.net to domain www.example.net you must add the protocol (http) as well, e.g.

如果您想从域example.net重写到域www.example.net,您还必须添加协议(http),例如

RewriteRule ^(.*)$ http://www.example.net/$1 [L,R=301,NC]

Another way to redirect a domain wholesale, is using the Redirect directive

重定向域批发的另一种方法是使用Redirect指令

Redirect / http://www.example.net

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

Using %{HTTP_HOST} has the same effect, because it doesn't include the scheme, i.e. http or https. Furthermore, you rewrite from %{HTTP_HOST} to %{HTTP_HOST}, which doesn't change a bit.

使用%{HTTP_HOST}具有相同的效果,因为它不包括方案,即http或https。此外,您从%{HTTP_HOST}重写为%{HTTP_HOST},这不会改变一点。

To fix this, you must prefix the substitution with www. and also a scheme, either http or https. The flag NC isn't needed here, because you look for any character .* anyway. So the rule should look like

要解决此问题,您必须在替换前加上www。还有一个方案,http或https。这里不需要标志NC,因为你寻找任何角色。*无论如何。所以规则应该是这样的

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

Finally, never test with R=301! See this answer Tips for debugging .htaccess rewrite rules for details.

最后,永远不要用R = 301进行测试!有关详细信息,请参阅此答案。调试.htaccess重写规则的提示。

#2


I had the same problem. The problem was not the rule. The rule was correct but the order of the rules in the .htaccess was not. This is what I had before. Note I am rewriting to non-www.

我有同样的问题。问题不在于规则。规则是正确的但.htaccess中规则的顺序不是。这就是我之前所拥有的。注意我正在重写非www。

#https
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

  #remove home
  RewriteCond %{THE_REQUEST} ^.*/home
  RewriteRule ^(.*)home$ https://example.com/$1 [R=301,L] 


 # !IMPORTANT! Set your RewriteBase here and don't forget trailing and leading
 #  slashes.
 # If your page resides at
 #  http://www.example.com/mypage/test1
 # then use
 # RewriteBase /mypage/test1/
 #RewriteBase /
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ index.php?/$1 [L]

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

I changed to

我换了

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

 #https
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

  #remove home
  RewriteCond %{THE_REQUEST} ^.*/home
  RewriteRule ^(.*)home$ https://example.com/$1 [R=301,L] 


 # !IMPORTANT! Set your RewriteBase here and don't forget trailing and leading
 #  slashes.
 # If your page resides at
 #  http://www.example.com/mypage/test1
 # then use
 # RewriteBase /mypage/test1/
 #RewriteBase /
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ index.php?/$1 [L]

#1


The problem is with

问题在于

RewriteRule ^(.*)$ www.example.net/$1 [L,R=301,NC]

www.example.net is taken as a relative path and not as a different domain.

www.example.net被视为相对路径而不是不同的域。

This is the reason, why it rewrites the URL http://example.net/some/path to http://example.net/www.example.net/some/path, which again is rewritten to http://example.net/www.example.net/www.example.net/some/path and so on.

这就是为什么它将URL http://example.net/some/path重写为http://example.net/www.example.net/some/path的原因,它再次被重写为http:// example .net / www.example.net / www.example.net / some / path等。

If you want to rewrite from domain example.net to domain www.example.net you must add the protocol (http) as well, e.g.

如果您想从域example.net重写到域www.example.net,您还必须添加协议(http),例如

RewriteRule ^(.*)$ http://www.example.net/$1 [L,R=301,NC]

Another way to redirect a domain wholesale, is using the Redirect directive

重定向域批发的另一种方法是使用Redirect指令

Redirect / http://www.example.net

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

Using %{HTTP_HOST} has the same effect, because it doesn't include the scheme, i.e. http or https. Furthermore, you rewrite from %{HTTP_HOST} to %{HTTP_HOST}, which doesn't change a bit.

使用%{HTTP_HOST}具有相同的效果,因为它不包括方案,即http或https。此外,您从%{HTTP_HOST}重写为%{HTTP_HOST},这不会改变一点。

To fix this, you must prefix the substitution with www. and also a scheme, either http or https. The flag NC isn't needed here, because you look for any character .* anyway. So the rule should look like

要解决此问题,您必须在替换前加上www。还有一个方案,http或https。这里不需要标志NC,因为你寻找任何角色。*无论如何。所以规则应该是这样的

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

Finally, never test with R=301! See this answer Tips for debugging .htaccess rewrite rules for details.

最后,永远不要用R = 301进行测试!有关详细信息,请参阅此答案。调试.htaccess重写规则的提示。

#2


I had the same problem. The problem was not the rule. The rule was correct but the order of the rules in the .htaccess was not. This is what I had before. Note I am rewriting to non-www.

我有同样的问题。问题不在于规则。规则是正确的但.htaccess中规则的顺序不是。这就是我之前所拥有的。注意我正在重写非www。

#https
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

  #remove home
  RewriteCond %{THE_REQUEST} ^.*/home
  RewriteRule ^(.*)home$ https://example.com/$1 [R=301,L] 


 # !IMPORTANT! Set your RewriteBase here and don't forget trailing and leading
 #  slashes.
 # If your page resides at
 #  http://www.example.com/mypage/test1
 # then use
 # RewriteBase /mypage/test1/
 #RewriteBase /
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ index.php?/$1 [L]

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

I changed to

我换了

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

 #https
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

  #remove home
  RewriteCond %{THE_REQUEST} ^.*/home
  RewriteRule ^(.*)home$ https://example.com/$1 [R=301,L] 


 # !IMPORTANT! Set your RewriteBase here and don't forget trailing and leading
 #  slashes.
 # If your page resides at
 #  http://www.example.com/mypage/test1
 # then use
 # RewriteBase /mypage/test1/
 #RewriteBase /
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ index.php?/$1 [L]