【问题标题】:Apache RewriteRule - everything except localhost and loopbackApache RewriteRule - 除了 localhost 和 loopback 之外的所有内容
【发布时间】:2015-10-08 20:39:30
【问题描述】:

我有一台服务器,我想强制与外界进行 https 通信,但是,服务器上的某些服务需要由本地服务器上的进程通过 http 访问。

我尝试了以下方法:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}

当然,在本地服务器上运行的服务无法通过 http 访问。我如何对除 localhost 和 127.0.0.1 之外的所有内容强制执行 https?或者,如果更简单,我有 2 个用于此服务器的外部域 - 我如何仅对 http://sub1.domain1.suffix1 和 http://sub2.domain2.suffix2 以及服务器面向外部的 IP 强制使用 https?

【问题讨论】:

  • 请举一个来自 127.0.0.1 的服务示例,我在 https/ssl 站点上做了很多基于服务器的请求,但它们都只是通过 lynx 向站点上的页面请求。我不清楚什么情况会涉及你所说的。如果这两个域是通过 apache vitualhosts 运行的,那么在正常情况下,您将设置每个域的 https,而不是每个服务器,除非您拥有 domain1 或 domain2 的所有子域的全局证书。
  • 我通过虚拟机在 Windows azure 上托管,所以我有 2 个域 - 一个由 azure (thedomain.cloudapp.net) 提供,一个我有我的 SSL 证书( mysub.mydomain.com)。没有人应该使用 cloudapp.net 域,但如果他们这样做了,我想确保我正确地将它们重定向到真正的 SSL 域。我正在使用位于盒子上的 parsoid 服务器运行 mediawiki。 Parsoid 只能通过本地机器访问,但它是一个 Web 服务,并且 mediawiki 被配置为通过localhost 访问它。

标签: apache mod-rewrite


【解决方案1】:

试试这个,我不肯定它会起作用,但它可能会起作用,我从未处理过实际的 'localhost' 值。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://mysub.mydomain.com/$1 [R=301,L]

更新 2:我想到了这一点,并意识到这无法处理这种情况: https://mysub2.mydomain.com/ 重定向到 https://mysub.mydomain.com/ - 在添加此之前,测试该 url 并查看它是否使用第一条规则重定向,如果没有,则测试第二组规则。

要纠正这种情况,请尝试:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} mysub2.mydomain.com [NC]
RewriteRule ^/?(.*) https://mysub.mydomain.com/$1 [R=301,L]

UPDATE2 说明,如果有效:

使测试更复杂,现在重写发生如果不是 localhost/127.0.0.1 然后测试不是 https 或者是 mysub2.mydomain.com (或您想要重定向到的服务器上的任何其他域/子域: https://mysub.mydomain.com

=更新说明:

这是一组非常简单的规则。我们创建了应用重写规则必须满足的 3 个条件。为了安全起见,我习惯性地使用 ^,也就是说,它是以它开头的,所以这就是说,主机名/IP 不以 localhost/127.0.0.1 开头。 !表示没有。

  1. 主机名不是 localhost(主机名是您在浏览器中键入以访问该页面的名称,或者是您用于通过 Web 服务访问它的名称)。因为域名不区分大小写,所以我添加了[NC]标志,表示No Case,即不区分大小写。这是我不确定是否可行的方法:

    RewriteCond %{HTTP_HOST} !^localhost [NC]

  2. 远程请求IP不是127.0.0.1

    RewriteCond %{REMOTE_ADDR} !^127.0.0.1$

  3. https 尚未启用

    RewriteCond %{HTTPS} !=on

然后是实际的重写规则,如果满足这三个条件就会触发。重写所有不包括起始 / 的 url,取该 url (.*) 中不包括域名的所有内容并将其添加到 https://mysub.mydomain.com/ 之后,然后执行 301 永久重定向到该结果完整 url。 ?表示 0 或 1。(.*) 表示:将开始/不开始/之后的所有内容放入 $1,规则中的每个 (...) 放入变量 $1、$2 等。

重写规则 ^/?(.*) https://mysub.mydomain.com/$1 [R=301,L]

=结束更新

您的设置对我来说并不完全直观,但假设服务器上只有一个实际域要处理请求,那么我认为这会起作用,而不是肯定的,因为我有一些功能我不熟悉。

要重定向到https,三个条件都必须为真,即not local/127,并且https not on。

【讨论】:

  • 做到了!非常感谢你。如果您有几分钟的时间,解释一下为什么这样做也会很有帮助。
  • 哦,它起作用了,那很好,因为你的设置,我不是很积极。这很简单,我会更新答案来解释它。
  • 现在我想起来了,您可能可以删除 localhost 条件,因为对于 localhost,REMOTE_ADDR 将是 127.0.0.1,但我想确定一下,因为我从未处理过这个问题设想。但是把它放在那里并没有什么坏处,而且如果 localhost 变成不是 127.0.0.1 的奇怪机会,你仍然会被覆盖。
【解决方案2】:

试试这个:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

【讨论】:

    【解决方案3】:

    这是一个稍微不同的情况,但是如果你在服务器前面有一个代理,比如负载均衡器,你可以这样做(这是 AWS 提出的,用于在 ELB 后面重定向到 TLS),我认为一旦我发现不这样做会使我的配置也重定向本地主机,这有点酷:

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多