HTACCESS RewriteCond没有搞乱localhost

时间:2010-07-06 06:36:25

标签: .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网站?

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:6)

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

# 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]

让我们把它分解。

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

RewriteCond %{REMOTE_ADDR} !127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

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

这比检查localhost或检查是否存在.更安全 - 它还允许您修改/etc/hosts文件,以便将www.myDomain.com指向您的nathan.dev.mydomain.com localhost用于更真实的测试。或者,如果您像我一样,则您拥有域名,例如mydomain.com.devRewriteCond %{HTTP_HOST} !^www\.

检查“www。”

!

如果域名没有(^ =没有),请以(www. =开头)RewriteCond %{SERVER_PORT} !^443$ 开始......

端口443与HTTPS环境变量

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

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

实际规则

www.

这会迫使一切都使用“www”。等效该域名。例如。 mydomain.com成为www.mydomain.com; mydomain.de成为www.mydomain.de。

作为替代方案,您可以使用以下规则强制每个域重定向到.com 以及 RewriteRule ^(.*)$ https://www.myDomain.com/$1 [R=301,L]

[OR]

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

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

http://mydomain.com

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

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

快乐的黑客攻击!

答案 2 :(得分:2)

RewriteCond %{HTTP_HOST}  \.

本地主机检查对我来说非常合适而不会破坏我的远程站点上的重定向,我也在寻找这个解决方案。我只需要记住在我的浏览器中输入“localhost”而不是127.0.0.1或192.168.x.x,但这不是约束。很好的解决方案。