Apache RewriteRule - 除localhost和loopback之外的所有内容

时间:2015-10-08 20:39:31

标签: apache mod-rewrite

我有一个服务器,我想要从外部世界强制执行https通信,但是,服务器上的服务需要通过本地服务器上的进程通过http访问。

我尝试了以下内容:

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

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

3 个答案:

答案 0 :(得分:6)

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

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/ - 在添加之前,测试该网址并查看是否重定向第一条规则,如果没有,请测试第二组规则。

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

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]标志,这意味着没有大小写,即不区分大小写。这是我不确定会工作的那个:

    RewriteCond%{HTTP_HOST}!^ localhost [NC]

  2. 远程请求IP不是127.0.0.1

    RewriteCond%{REMOTE_ADDR}!^ 127.0.0.1 $

  3. https尚未开启

    RewriteCond%{HTTPS}!= on

  4. 然后是实际的重写规则,如果满足这三个条件则触发。重写不包括起始/的所有网址,取出不包含域名的网址(。*)中的所有内容,并在https://mysub.mydomain.com/之后添加,然后执行301永久重定向到生成的完整网址。 ?表示0或1.(。*)表示:在开始之后放入所有内容/或者没有开始/放入$ 1,规则中的每个(...)都放入变量$ 1,$ 2,依此类推。

    RewriteRule ^ /?(。*)https://mysub.mydomain.com/ $ 1 [R = 301,L]

    = END更新

    对我来说,您的设置对我来说并不完全直观,但假设您希望处理请求的服务器上只有一个实际域,那么我认为这样做可行,而不是积极的,因为那里有#s;我不熟悉的一些功能。

    要重定向到https,所有三个条件都必须为true,即不是local / 127,而https不是on。

答案 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]

答案 2 :(得分:0)

这是一个稍微不同的情况,但是如果您在服务器之前有一个代理(如负载均衡器),则可以执行此操作(这是AWS提出的在ELB之后重定向到TLS的建议),我认为一旦我发现不执行此操作会使我的配置也重定向本地主机,那将很酷:

$('#denialCodesList-@viewId').multipleSelect({
        isopen: true,
        multipleWidth: 55,
        filter: true,
        selectAll: false,
});