wcf webservice和使用https进行URL转发

时间:2014-12-16 01:51:20

标签: wcf https subdomain windows-server-2012 iis-8

我一直在研究并尝试解决这个问题几天没有成功。

我在Windows Server 2012上的IIS 8上部署了WCF Web服务。

在开发过程中,我一直在使用服务的完整URL来进行服务调用。

示例:

http://myserver.com/appservices/service1.svc/getdata 

但现在我需要做以下事情:

  1. 我在godaddy上有一个域名,让我们说 somedomain.com ,我希望有一个子域名 services.somedomain.com 来代替完整的网址。所以我想要services.somedomain.com/getdata之类的内容,而不是写上面的完整网址。我无法做到这一点。我尝试在Godaddy上设置URL转发,以便子域服务转发到http://myserver.com/appservices/service1.svc,这可以在浏览器上运行,但是当在移动应用程序上使用它或通过fiddler时我得到301错误。 (无论是否有遮蔽,我都试过了)。有没有办法实现这个目标?

  2. 我需要获得SSL认证。我的问题是,我应该从哪个域获得它?如何获取 somedomain.com 或子域 services.somedomain.com ,或者可能是原始域 myserver.com 。我有点迷失在这里,我不想买错ss证书

  3. 为了让您全面了解我希望得到的最终结果,我需要具备以下条件:

    somedomain.com 指向部署在iis上的网站

    services.somedomain.com 指向部署在同一个iis上的wcf webservice,它将用于将从android / iphone调用的服务。 这需要获得SSL认证

    我从godaddy

    购买了 somedomain.com

    非常感谢任何暗示/帮助我真的很感激

4 个答案:

答案 0 :(得分:3)

现在我从上述问题中对情况有了更好的了解。

首先,当您拥有这两个域并且您是Windows 2012服务器的管理员时,我建议您将somedomain.com添加到您的服务器直接,即不重定向。这样做更好,因为您只需购买所需的SSL证书。如果您使用重定向,则需要两个域的SSL证书,否则您的用户将收到安全警告,因为原始请求与证书不匹配。

你想要的是Url Rewrite,而不是Redirect。有什么不同? 重定向客户端请求,以使网络浏览器转到其他网站(使用301 error code)。 重写是URL到达您服务之前的服务器端重写

您可以开始使用Url重写将以下内容添加到Web.config文件中:

<system.webServer>
  <rewrite>
    <rules>
      <!-- My rules -->
    </rules>
  </rewrite>
</system.webServer>

我们将添加一些规则(假设您在同一台服务器上有services.somedomain.com)。

  1. 第一条规则,将http://services.somedomain.com/appservices/service1.svc/getdata重写为http://services.somedomain.com/getdata

    <rule name="SubDomainAppService" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
            <add input="{HTTP_HOST}" pattern="^services\.somedomain\.com$" />
        </conditions>
        <action type="Rewrite" url="{HTTPS}services.somedomain.com/appservices/service1.svc/{R:1}" />
    </rule>  
    

    这将匹配正则表达式模式services.somedomain.com/getdata的位置,捕获网址的剩余部分并在内部将其重写为services.somedomain.com/appservices/service1.svc/getdata。此规则还强制/重写对HTTPS的请求。

  2. 要为您的网站强制使用SSL,您可以通过添加重写规则来执行此操作。这会将HTTP上的任何传入请求重写为HTTPS

    <rule name="Redirect to HTTPS" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$" />
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
    </rule>
    
  3. URL重写是一个复杂的主题,甚至不是我完全理解的主题。我在回答这个问题时读到的一些资源:


    加分:

    对于您的DNS,域和SSL证书,我建议您使用更好的提供商,例如DNSimple。阅读Troy Hunt的post why he moved。来自DNSimple的子域和通配符的SSL证书为on their site

    *如果你不知道Troy Hunt是谁,请阅读他关于安全性的其他文章。特别是他关于首先攻击你的API的帖子。

答案 1 :(得分:2)

您需要配置服务器,使其托管两个网站:

  1. somedomain.com绑定:
    • 协议:http,主机名:somedomain.com,端口:80
    • protocol:http,hostname:www.somedomain.com,port:80
  2. 带有绑定的services.somedomain.com:
    • 协议:https,主机名:services.somedomain.com,端口:443
    • protocol:http,hostname:services.somedomain.com,port:80
  3. (最后一个绑定将仅用于将http流量重定向到https)。

    SSL

    您必须安装SSL证书才能在IIS中创建SSL绑定。 SSL证书包含有关颁发证书的主机名的信息。颁发给 foo.com 的证书不能用于识别 bar.com 。如果您需要保护多个主机名,请确保向证书提供商说明您的需求(在这种情况下,他们会建议使用UCC或通配符证书)。

    另请注意,IIS7上的SSL主机头配置只能通过appcmd命令行完成。

    部署:

    将两个网站设置在不同的目录中(一个包含www内容,另一个包含webservice文件)。将网站和Web服务文件分开后,您可以选择将Web服务文件放在根目录中。

    网址重写:

    如果您想从网址中删除service1.svc,可以使用网址重写。它需要安装URL Rewrite module。您可以使用IIS管理器GUI来创建规则。以下是为services.somedomain.com生成的web.config文件的示例:

    <system.webServer>
        <!-- other rules -->
        <rewrite>
            <rules>
                <rule name="http to https" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Temporary" />
                </rule>
                <rule name="everything to service1.svc">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/appservices/service1.svc/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
    

答案 2 :(得分:1)

既然你问了几个问题我希望回答其中一些问题:

  1. 首先检查您的子域services.domain.com是否由godaddy正确转发。 Ping到子域以检查它是否到达您自己的服务器。在IIS中,您使用主机名services.domain.com添加Web服务。 对于该网站,您添加一个单独的网站,其主机名为:domain.com

  2. 您有几种SSL证书选项,但最便宜的选择是获取子域名:services.domain.com。在web.config中,您可以添加如下所示的重定向,以确保服务始终使用HTTPS连接。

    <system.webServer>
    <rewrite>
      <rules>
        <rule name="Redirect to HTTPS" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="^OFF$" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
    

    enter code here

答案 3 :(得分:0)

  1. 在GoDaddy上定义somedomain.comservices.somedomain.com&#34; A&#34;使用服务器的IP地址记录,并将它们配置为服务器上的两个站点。 不要重定向 - 即使您使用它也会降低用户的速度,并且需要额外的证书。

  2. 您需要两个证书 - 一个用于somedomain.com,另一个用于*.somedomain.com请注意通配符 - 如果您需要其他子域,这将允许您使用相同的证书。

  3. 在几个月内,我们希望看到免费SSL - 请查看 Let's Encrypt ,最好不要长期提交。

  4. 您可以通过简单地将/appservices/service1.svc设置为您网站的默认值来避免重写网址,假设所有services.somedomain.com服务都是通过此入口点提供的。