IIS + PHP Pretty URL (key,value) 去掉双斜杠

IIS + PHP Pretty URL (key,value) removes double slashes

已经从 apache 服务器迁移到 IIS,基本传输非常简单,而且是 运行,但我有一个相当烦人的问题想要解决。

问题:他们正在使用 zii 'cgridview' 来显示他们的表格;虽然它不是一个很好的解决方案(可能是实现),但它适用于 Apache。

分页本身工作正常,但是当他们过滤它时;它会做一个 'GET' 来获取所有信息,这种工作是第一次,但是当我们分页到另一个页面时它突然变得混乱(因为它是一个 GET)。

这里的问题是它会对所有过滤器发出请求,所以它就像: https://example.com/controller/action/filter1/value/filter2//filter3//filter4/hallo 这通常是它应该如何工作的正确格式(至少使用 apache 重写),但是 IIS 似乎不喜欢这样,在我看来为什么?

如果你更喜欢我们得到一个过滤器1,下一个参数是一个值; filter2 没有值,所以它是空的,现在有两个 'slashes'(在这些斜线之间什么都没有;所以它是空的)但据我所知,IIS 正在修剪那些斜线,所以它是一个斜线。

过滤器 1 的过滤器按预期工作;但 filter2 将 filter3 作为值;这是不正确的。 有谁知道是什么导致了这个问题?

重写是这样的:

<rule name="yii_rewrite" stopProcessing="true">
    <match url="." ignoreCase="false" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
    </conditions>
    <action type="Rewrite" url="index.php" appendQueryString="true" />
</rule> 

感谢您的宝贵时间,非常感谢!

目前,这些双斜杠将由现代 IIS/Apache 网络服务器处理。只有一些旧的浏览器会将双斜杠转换为其他含义。因此,我们可以在 IIS/Apache 服务器中添加 URL Rewrite 规则来删除多余的斜杠,如下所示。

mod_rewrite 在 Apache 中。

# remove multiple slashes anywhere in url 
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

同样,在IIS中URL重写模块。

<rewrite>
  <rules>
    <rule name="Imported Rule" stopProcessing="true">
      <match url="." ignoreCase="false" />
      <conditions>
        <!--# remove multiple slashes anywhere in url -->
        <add input="{URL}" pattern="^(.*)//(.*)$" ignoreCase="false" />
      </conditions>
      <action type="Redirect" redirectType="Permanent" url="{C:1}/{C:2}" />
    </rule>
  </rules>
</rewrite>

详情请参考下方link
https://webmasters.stackexchange.com/questions/8354/what-does-the-double-slash-mean-in-urls/8381#8381

我建议通过设置 CUrlManager::$appendParamsfalse 来完全禁用此行为。因此,您应该得到像 https://example.com/controller/action?filter1=value&filter2=&filter3=&filter4=hallo 这样的 URL,这样应该不会造成任何问题,不会造成混淆。

据我所知,问题是因为 'REQUEST_URI' 默认编码,双斜杠变成单斜杠。为了解决这个问题;我们可以将 REQUEST_URI 替换为 UNENCODED_URL;这样双斜线仍然存在。

这是可行的,但 IIS 一定有其原因;最好在代码中修复它而不是在其上贴上创可贴。如果这会导致问题;我很想听听它 - 最好我想彻底解决这个问题,即使这是将在年底停止的旧代码。

<serverVariables>
   <set name="REQUEST_URI" value="{UNENCODED_URL}" />
</serverVariables>