Php IIS重写使用$\u GET请求产生与Apache不同的结果

Php IIS重写使用$\u GET请求产生与Apache不同的结果,php,iis,url-rewriting,Php,Iis,Url Rewriting,我最近在本地主机上切换到IIS,但我遇到了一些我不明白的事情 我有一个像这样设置的重写规则 <rule name="Pages" stopProcessing="true"> <match url="^page/(.*)/$" ignoreCase="true" /> <action type="Rewrite" redirectType="Permanent" url="/resources/pages/getPage.php?page

我最近在本地主机上切换到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/resources/pages/getPage.php?page=login 
其中getPage.php将为用户提供所需的页面

当我跑的时候

$_GET['page]
在getPage.php脚本上返回

page/login/

这与$\u SERVER['REQUEST\u URI']sans开头相同/I预期它只会导致登录。在运行Apache时,它就是这样工作的。那么IIS处理这种重写的方式有什么错误或不同呢?

示例IIS web.config规则从您的站点/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>

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

因此,请改为:

url="/resources/pages/getPage.php?page={R:1}"
但是,您的匹配组。*将匹配到最后一个斜杠的所有内容。如果要匹配更多组,则需要更具体,如:

^page/([\w_]+)/$
此处,\w将匹配字母数字字符和破折号。_uu匹配下划线

要拥有更多细分,请执行以下操作:

^page/([\w_]+)/([\w_]+)/$
……等等。如果只想匹配数字,可以添加[\d]+


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

我认为第一个匹配R:0是完整字符串的完全匹配,而R:1是登录的第一个捕获组。用?page={R:1}试试看它是否有效。谢谢,这确实有效,但仍然是一个不同于我在Apache中收到的结果。例如,如果我发送URL localhost/page/login/test/10,{R:1}返回login/test/10,正如您所指出的。但在Apache中,它只是登录。我想它会把它们分成几对。那是因为你有.*/$这是最后一个斜杠之前的所有内容。这与Apache中的mod_rewrite是一样的。正则表达式是什么来捕捉它们成对的呢?我真的需要在正则表达式方面做得更好。谢谢,我会看看我是否能让它工作。你可能想补充一个解释?请不要用粗体字写你的文章。解释会很好,因为我不知道这对我的问题有什么影响。@PaulNeale在这个答案中你唯一需要关心的是{R:1}。没有其他事情与你的问题无关,因为这是一条综合路线。是的,对不起,太多了。
^page/([\w_]+)/([\w_]+)/$