HTACCESS RewriteCond没有搞乱localhost

cod*_*ama 4 .htaccess redirect

我有以下一堆域名:

  • myDomain.de
  • myDomain.com
  • myDomain.co.za
  • myDomain.org
  • myDomain.com
  • myDomain.com.na

在htaccess中编写最短的方法是什么,以便创建所有域...

  1. 重定向到https://www.myDomain.com.即无论输入的域名是什么,它都会添加www AND重定向到https,和
  2. 仍在我的本地机器上工作(如果有人在http:// localhost/site/src中键入它不会重定向到www站点?

Tim*_*one 10

让我们看看这是否有效:

RewriteEngine On

# Check if the host name contains a . (localhost won't)
# Check if the host name starts with www
# Check if the host name ends with .com
# Check if the connection is secure
RewriteCond %{HTTP_HOST}  \.
RewriteCond %{HTTP_HOST} !=svn.myDomain.com
RewriteCond %{HTTP_HOST} !^www   [OR]
RewriteCond  %{HTTP_HOST} !\.com$ [OR]
RewriteCond %{HTTPS}     !=on
RewriteRule ^.*$ https://www.myDomain.com/$0 [R=301,L]
Run Code Online (Sandbox Code Playgroud)


Nat*_*.B. 7

一个万无一失的解决方案:

# If not on www., redirect to www. on SSL
RewriteCond %{REMOTE_ADDR} !127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
RewriteCond %{HTTP_HOST} !^www
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

# If not on SSL(ish), redirect to SSL
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REMOTE_ADDR} !127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

让我们分解吧.

如果请求客户端不在保留的本地主机IP地址上

RewriteCond %{REMOTE_ADDR} !127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
Run Code Online (Sandbox Code Playgroud)

通常,在访问本地托管的网站时,客户端的IP地址是127.0.0.1.时不时地,它是127.0.1.0.但整个127.x.x.x范围都是为本地保留的,所以我要检查所有这些,以防你有一个有趣的设置.

这比检查localhost或检查是否存在更安全.- 它还允许您编辑/etc/hosts文件以指向www.myDomain.com本地主机以进行更真实的测试.或者,如果你像我一样,你有一个域名,就像nathan.dev.mydomain.commydomain.com.dev.

检查"www."

RewriteCond %{HTTP_HOST} !^www\.
Run Code Online (Sandbox Code Playgroud)

如果域没有(!=不)以(^=开头)开头www....

端口443 vs HTTPS环境变量

RewriteCond %{SERVER_PORT} !^443$
Run Code Online (Sandbox Code Playgroud)

使用端口443是一种更安全的检查,因为在使用负载平衡服务器时无法保证HTTPS环境变量.

实际的规则

RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

这会迫使一切都使用"www".相当于该域名.例如mydomain.com成为www.mydomain.com; mydomain.de成为www.mydomain.de.

作为替代方案,可以使用下面的规则,迫使每一个域名重定向到www. 以及.com:

RewriteRule ^(.*)$ https://www.myDomain.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

两个条件/规则块,而不是一个.

使用两个块,您可以更清楚地了解到底发生了什么.此外,如果要求允许使用任何TLD,则将其写为一个块将不起作用.如果使用上面的备用规则,您可以将它们组合成一个块.单块交替看起来像这样(注意添加[OR]):

RewriteCond %{REMOTE_ADDR} !127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
RewriteCond %{HTTP_HOST} !^www [OR]
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.myDomain.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

值得注意的是,两个块的解决方案有时会导致两个重定向,如果按照确切的顺序保留它,则会减少重定向.

示例:使用当前的规则顺序,如果客户端请求http://mydomain.com,则第一个块将应用(不www.存在)并将重定向到https://www.mydomain.com.但是,如果您翻转订单,那么服务器将首先检测到缺少SSL并且客户端将被重定向到https://mydomain.com,然后服务器将检测到缺少www.并提供额外的重定向https://www.mydomain.com.tl; dr:不要改变顺序.:)

快乐的黑客!