【问题标题】:IIS rewrite produces different outcome with $_GET request than ApacheIIS 重写使用 $_GET 请求产生与 Apache 不同的结果
【发布时间】:2017-08-07 21:45:30
【问题描述】:

我最近在我的本地主机上切换到了 IIS,但我遇到了一些我不明白的事情。

我有一个类似设置的重写规则。

<rule name="Pages" stopProcessing="true">  
     <match url="^page/(.*)/$" ignoreCase="true" />  
     <action type="Rewrite" redirectType="Permanent" url="/resources/pages/getPage.php?page={R:0}" />  
</rule>

这是正常工作的地方

localhost/page/login/ 

会带你去

localhost/resources/pages/getPage.php?page=login 

getPage.php 将在哪里为用户提供所需的页面。

当我跑步时

$_GET['page]

在它返回的 getPage.php 脚本上

page/login/

这与没有前导“/”的 $_SERVER['REQUEST_URI'] 相同,我希望它只会导致“登录”。在运行 Apache 时,这就是它的工作方式。那么 IIS 处理这种重写的方式有什么问题或不同呢?

【问题讨论】:

  • 我认为第一个匹配 R:0 是完整匹配(完整的字符串),而R:1 是第一个捕获组(即login)。用?page={R:1} 试试看它是否有效。
  • 谢谢,这确实有效,但仍然与我在 Apache 中收到的结果不同。例如,如果我发送 URL localhost/page/login/test/10,{R:1} 如您所指出的那样返回 login/test/10。但在 Apache 中,它只是登录。我猜它会将它们分成几对。
  • 那是因为你有(.*)/$,它是“捕捉到最后一个斜线的所有内容”。这与 Apache 中的 mod_rewrite 相同。
  • 正则表达式将它们成对捕获是什么?
  • 我确实需要在正则表达式方面做得更好。谢谢,我会看看我能不能让它工作。

标签: php iis url-rewriting


【解决方案1】:

您当前正在获取R:0,它是完整字符串的完整匹配项。要获取第一个正则表达式组(.*),您需要使用R:1

所以改成:

url="/resources/pages/getPage.php?page={R:1}"

但是,您的匹配组(.*) 将匹配所有内容,直到最后一个斜线。如果要匹配更多组,则需要更具体,例如:

^page/([\w_]+)/$

在这里,\w 将匹配字母数字字符和破折号。 _ 匹配下划线。

拥有更多细分:

^page/([\w_]+)/([\w_]+)/$

...等等。如果只想匹配数字,可以添加([\d]+)

请记住,您需要使用R:1R:2 等,具体取决于您要通过的组。

【讨论】:

    【解决方案2】:

    示例 IIS web.config 规则从 yoursite/index.php/controller/page/ 中删除 index.php

          <rule name="CodeIgniter Url Rewrite rule" stopProcessing="true">
          <match url="^(.*)$" ignoreCase="false" />
          <conditions logicalGrouping="MatchAll">
              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />          
          </conditions>
          <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />
          </rule>
    

    【讨论】:

    • 您可能想添加解释?请不要把你的文字全部写成粗体。
    • 解释会很好,因为我不确定这如何适用于我的要求。
    • @PaulNeale 在这个答案中您唯一需要关心的是{R:1}。没有什么与您的问题无关,因为这是一条“包罗万象”的路线。
    • 是的,对不起,太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2015-04-24
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多