【问题标题】:Using IIS 7.5 URL rewrite for dynamic subdomains at same IP对同一 IP 的动态子域使用 IIS 7.5 URL 重写
【发布时间】:2014-07-03 05:09:50
【问题描述】:

好的。在潜伏了几年并感谢愿意提供帮助的人们之后,我的第一个问题是,因此感谢您对我的新手和不准确的术语的耐心等待。

我继承了一份工作和一个项目,其中用户拥有自己的子域,其中包含一组 4-5 个模板 php 页面,其中存储在 mysql 数据库中的半可定制内容。它应该在它出现之前工作,现在它没有,所以我正在尝试调试整个事情,因为我必须为另一个域复制项目,所以我来找你,我的大师,经过几个小时的研究,来自互联网的死胡同和半真半假。

我浏览过IIS URL Rewrite 页面,环顾四周和其他地方,但我只是感到困惑。

我正在尝试为越来越多的用户完成以下任务:

bubba.example.com ===>example.com/users/index.php?c=bubba
bubba.example.com/about.php ===> example.com/users/about.php?c=bubba bubba.example.com/contact.php ===> example.com/users/contact.php?c=bubba

等等...但无论用户名/子域名或模板站点如何,我每次都会收到 404 错误。一些背景资料:

  • 使用 IIS 7.5 和 URL 重写模块从同一 IP 运行多个域/站点(主要是 PHP)
  • IIS 中的默认网站/直接 IP 指向我们主要公司的网站。
  • 域的DNS区域文件有“*”和“@”的A记录指向网络服务器的IP
  • 我们确实为我们自己的子域指定了其他 CNAME 条目,例如 ftp、stmp、pop、admin 等。
  • 此域的根文件夹中的 web.config

我已经通过 web.config 和 IIS 面板获得了第一条规则的多个版本,这只是最新版本,我知道它不起作用:

<rule name="User Sites" stopProcessing="true">
    <match url="(.*)" />
    <conditions trackAllCaptures="true">
        <add input="{HTTP_HOST}" pattern="^(\w+)\.(example\.com)$" />
        <add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
    </conditions>
    <action type="Rewrite" url="http://(C:1)/users/{R:0}?c={C:0}" logRewrittenUrl="true" />
</rule>

我的下一步是为每个模板页面设置规则,如下所示(可能没有正确的正则表达式,但你明白了:

<rule name="User about page" stopProcessing="true">
    <match url="^about\.php$" />
       <conditions trackAllCaptures="true">
         <add input="{HTTP_HOST}" pattern="^(\w+)\.(example\.com)$" />
         <add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
       </conditions>
   <action type="Rewrite" url="http://(C:1)/users/about.php?c={C:0}" logRewrittenUrl="true" />
</rule>

我们将不胜感激,即使是朝着正确的方向推进

编辑:

好的,所以现在真的是关键时刻,但仍然没有明确的答案。

这是我最新的规则,但它仍然不起作用......

<rule name="rewrite">
   <match url="(.*)?" />
   <conditions>
        <add input="{HTTP_HOST}" pattern="^(?!www)(.*)\.(.*\.c.*)$" />  
   </conditions>
   <action type="Rewrite" url="http://www.{C:3}/users/{R:0}\?c={C:1}" appendQueryString="true"
</rule>

我意识到这太过分了,因为它不仅限于我想要重写的 2 个域,但我需要一些功能才能改进,但这仍然无法正常工作。

【问题讨论】:

  • IIS 上的绑定是什么样的?您可以通过右键单击站点并选择Edit Bindings...,然后选择http 绑定并单击Edit 或从applicationHost.config 下的bindinfInformation 标签来获得它。同时,您可以做的另一件事来帮助您调试是enabling FREB,并查看每个请求生成的错误日志。您将能够看到 url 被重写为什么以及 IIS 中的哪个模块返回 404
  • 抱歉耽搁了。绑定不是什么花哨的东西:http example.com 80 * http www.example.com 80 * https [blank] 443 *
  • 我在故障排除时确实发现了一些奇怪的东西:如果我使用 https 而不是普通的 http 请求访问它们,我的用户站点就很好。我在想这是因为我的 https 绑定没有设置特定的主机名,因此正在考虑并随后处理完整的 HTTP_HOST ...我不能为 http 输入空白主机绑定,因为我还有其他几个站点这个服务器,我需要设置这个站点的第二个版本(即 exampleABC.com),它需要相同的功能......让我好奇。

标签: iis url-rewriting iis-7.5 subdomain multiple-domains


【解决方案1】:

好的。事实证明,还有其他入站和出站重写规则隐藏在 applicationHost.config 和每个域的各个 web.config 文件中,这些文件没有填充到相应的 URL 重写模块中。也许是我前任的告别礼物?我永远不会知道。

如果像我这样没有经验的网络管理员在他们自己的项目中遇到这种情况,我必须这样做:

  • 服务器的IP:123.456.789.0(这个例子我知道是无效的)
  • DNS A 记录:* => 123.456.789.0 , @ =>123.456.789.0(两个域具有相同的 A 记录。)

默认网页

  • 根目录:%SystemDrive%\inetpub\wwwroot
  • 绑定:protocol="http" bindingInformation="*:80:"

Example1.com

  • 根目录:%SystemDrive%\inetpub\wwwroot\example1
  • 绑定:
    • protocol="http" bindingInformation="*:80:www.example1.com"
    • protocol="http" bindingInformation="*:80:example.com"

Example2.com

  • 根目录:%SystemDrive%\inetpub\wwwroot\example2
  • 绑定:
    • protocol="http" bindingInformation="*:80:www.example2.com"
    • protocol="http" bindingInformation="*:80:example.com"

重写规则如下所示:

<rewrite>
   <rules>
     <rule name="rewrite" enabled="true" stopProcessing="true">
       <match url="(.*)" />
       <conditions>
         <add input="{HTTP_HOST}" pattern="^(?!www\.)(.*)\.example1\.com$" />
       </conditions>
       <action type="Rewrite" url="example2/users/{R:0}?c={C:1}" appendQueryString="true" />
     </rule>
     <rule name="rewrite2" enabled="true" stopProcessing="true">
       <match url="(.*)" />
        <conditions>
          <add input="{HTTP_HOST}" pattern="^(?!www\.)(.*)\.example2\.com$" />
        </conditions>
        <action type="Rewrite" url="example2/users/{R:0}?c={C:1}" appendQueryString="true" />
      </rule>
   </rules>
 </rewrite>

默认网站的重写配置充当我们这两个域的用户页面的“路由器”。

对于那些不熟悉正则表达式的人,

  • "^(?!www)" = 字符串不能以文字字母“www”开头
    • "(.*)" = 任何字符组,但不是可选的。括号将其捕获以供反向参考
  • ".example1.com$" = 主机的其余部分必须是 [dot]example1[dot]com,因为 "$" 表示字符串的结尾。

我仍然需要调整我们的 SEO 规范化,因此我还必须进行规范化重写工作,其中包括一个注册为“.com”和“.ca”的网站,但至少我是我在途中。

我确信有一种更漂亮的方法可以做到这一点,但目前可行。

希望这可以帮助其他人在未来尝试这样做。

C.

【讨论】:

    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2013-08-14
    • 2013-07-26
    • 2012-05-23
    相关资源
    最近更新 更多