对同一IP上的动态子域使用IIS 7.5 URL重写

对同一IP上的动态子域使用IIS 7.5 URL重写,iis,url-rewriting,iis-7.5,subdomain,multiple-domains,Iis,Url Rewriting,Iis 7.5,Subdomain,Multiple Domains,好的。我的第一个问题是,经过几年的潜行,感谢那些愿意帮助我的人,所以,首先感谢你们对我的新意和不准确的术语有耐心 我继承了一份工作和一个项目,其中用户通过一组4-5个模板php页面获得自己的子域,这些页面具有存储在mysql数据库中的半自定义内容。我认为它在出现之前就可以工作,现在不行了,所以我正试图调试整个过程,因为我必须将项目复制到另一个领域,所以我来找你,我的导师,经过几个小时的研究、死胡同和来自互联网的半真半假 我已经翻阅了这一页,到处看看,但我只是感到困惑 我正试图为越来越多的用户实现

好的。我的第一个问题是,经过几年的潜行,感谢那些愿意帮助我的人,所以,首先感谢你们对我的新意和不准确的术语有耐心

我继承了一份工作和一个项目,其中用户通过一组4-5个模板php页面获得自己的子域,这些页面具有存储在mysql数据库中的半自定义内容。我认为它在出现之前就可以工作,现在不行了,所以我正试图调试整个过程,因为我必须将项目复制到另一个领域,所以我来找你,我的导师,经过几个小时的研究、死胡同和来自互联网的半真半假

我已经翻阅了这一页,到处看看,但我只是感到困惑

我正试图为越来越多的用户实现以下目标:

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区域文件具有指向Web服务器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>

我意识到这太过分了,因为它不仅仅局限于我想重写的两个域,但我需要一些功能性的东西才能进行优化,而这仍然不能正常工作。

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

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

服务器的IP:123.456.789.0对于这个例子,我知道它是无效的 DNS A记录:*=>123.456.789.0,@=>123.456.789.0两个域都有相同的A记录。 默认网页

根目录:%SystemDrive%\inetpub\wwwroot 绑定:协议=http绑定信息=*:80: 例1.com

根目录:%SystemDrive%\inetpub\wwwroot\example1 绑定: 协议=http绑定信息=*:80:www.example1.com 协议=http绑定信息=*:80:example.com 例2.com

根目录:%SystemDrive%\inetpub\wwwroot\example2 绑定: 协议=http绑定信息=*:80:www.example2.com 协议=http绑定信息=*: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和A.ca,但至少我在路上。p> 我相信有一种更漂亮的方法可以做到这一点,但这在目前是可行的

希望这能帮助其他人在将来尝试这样做


C.

IIS上的绑定是什么样子的?您可以通过右键单击站点并选择编辑绑定。。。然后选择http绑定并单击编辑,或从BindinInformation标记下的applicationHost.config中单击。同时,另一件可以帮助您进行调试的事情是查看每个请求生成的错误日志。您将能够看到url被重写成了什么,以及IIS中的哪个模块正在返回404消息,并对延迟表示歉意。绑定一点也不奇怪:http example.com 80*http www.example.com 80*https[blank]443*我在排除故障时发现了一些奇怪的东西:我的用户站点 如果我使用https而不是普通的http请求访问它们,则s是可以的。我认为这是因为我的https绑定没有设置特定的主机名,所以正在考虑并随后处理完整的HTTP_主机。。。我不能为http设置空白主机绑定,因为我在这台服务器上还有几个其他站点,我需要设置此站点的第二个版本,即exampleABC.com,它需要相同的功能。。。给我涂上猜谜的颜色。