Apache重写规则-除localhost和环回之外的所有内容

Apache重写规则-除localhost和环回之外的所有内容,apache,mod-rewrite,Apache,Mod Rewrite,我有一个服务器,我想强制与外界进行https通信,但是,服务器上有一些服务需要本地服务器上的进程通过http访问 我尝试了以下方法: RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} 当然,本地服务器上运行的服务无法通过http访问。除了localhost和127.0.0.1之外,我如何对所有内容强制使用https?或者,如果更简单的话,我有两个用于此服务器的外部

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

我尝试了以下方法:

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

当然,本地服务器上运行的服务无法通过http访问。除了localhost和127.0.0.1之外,我如何对所有内容强制使用https?或者,如果更简单的话,我有两个用于此服务器的外部域-如何仅强制和服务器的外部面向IP使用https?

试试看,我不确定它是否有效,但可能有效,我从未处理过实际的“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:我考虑过这一点,意识到这无法处理这个案件: 重定向到-在添加该url之前,测试该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]
更新2说明,如果有效:

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

=更新说明:

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

  • 主机名不是localhost(主机名是您在浏览器中键入以访问页面的名称,或您通过web服务访问页面时使用的名称)。由于域名不区分大小写,我添加了[NC]标志,这意味着没有大小写,即case insistive。这是一个我不确定是否有效的标志:

    重写cond%{HTTP_HOST}!^localhost[NC]

  • 远程请求IP不是127.0.0.1

    重写COND%{REMOTE\u ADDR}!^127.0.0.1$

  • https尚未打开

    RewriteCond%{HTTPS}!=on

  • 然后是实际的重写规则,如果满足这三个条件就会触发。重写所有不包括起始/的url,获取该url(*)中不包括域名的所有内容,并将其添加到后面,然后执行301永久重定向到结果完整url。?表示0或1。(.*)意思是:将启动/或不启动/后的所有内容放入$1,规则中的每个(…)都放入变量$1、$2,依此类推

    重写规则^/?(*)$1[R=301,L]

    =结束更新

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

    要重定向到https,所有三个条件都必须为true,即非本地/127,且https未打开。

    请尝试以下操作:

    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]
    

    这是一种稍微不同的情况,但如果您在服务器前面有一个代理,比如负载平衡器,您可以这样做(AWS建议在ELB之后重定向到TLS),我认为这很酷,因为我发现不这样做会使我的配置也重定向本地主机:

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

    请举一个127.0.0.1中的服务的例子,我在https/ssl站点上做了很多基于服务器的请求,但它们都只是通过lynx请求站点上的一个页面。我不清楚什么情况会涉及到您所说的内容。如果这两个域是通过apache vitualhosts运行的,那么您将在正常情况下为每个域设置https,而不是每个服务器,除非您拥有域1或域2的所有子域的全局证书。我通过VM在windows azure上托管,因此我有两个域-一个是azure提供的域(thedomain.cloudapp.net),另一个是我拥有SSL证书的域(mysub.mydomain.com)。任何人都不应该使用cloudapp.net域,但如果他们这样做,我希望确保我将他们正确重定向到真正的SSL域。我正在使用位于机箱上的parsoid服务器运行mediawiki。parsoid只能通过本地计算机访问,但它是一个web服务,并且mediawiki配置为通过访问它。这样做了!非常感谢。如果你有几分钟的时间,解释一下为什么这样做也会很有帮助。哦,这样做很好,因为你的设置我不是很肯定。很简单,我会更新答案来解释。现在我想起来了,你可能可以删除localhost条件,因为localhost的REMOTE_ADDR将是127.0.0.1,但是我我敢肯定,因为我从来没有处理过这种情况。但它没有伤害到有它在那里,在奇怪的机会,localhost成为不是127.0.0.1你仍然会被涵盖。