1

我的网站上有几个页面有长且不可读的 URL,我希望能够缩短这些页面。我遇到的问题是附加带有变量值的查询字符串。

例如:“www.example.com/dir1/dir2/filename.php”缩短为“www.example.com/file”。“www.example.com/dir1/dir2/filename.php?id=2”将是“www.example.com/file/2”。“www.example.com/dir1/dir2/filename.php?id=2&alt=6”将是“www.example.com/file/2/6”。

然后我们的页面使用“id”和“alt”的值来访问我们数据库中的信息,这决定了页面的内容。这些值可以改变,并且没有固定的数量。

现在,我使用以下重写规则使第一个示例运行良好:

<rewrite>
        <outboundRules>
            <remove name="OutboundRewriteUserFriendlyURL1" />
        </outboundRules>
        <rewriteMaps>
            <rewriteMap name="StaticRewrites">
                <add key="/file" value="/dir1/dir2/filename.php" />                    
            </rewriteMap>
        </rewriteMaps>
      <rules>
        <rule name="Rewrite Rule">
          <match url=".*" />
          <conditions>
            <add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
          </conditions>
          <action type="Rewrite" url="{C:1}" />
        </rule>
      </rules>
</rewrite>

但是我找不到任何允许 URL 包含变量的东西。我所看到的一切都使用了静态重写,就像我当前的解决方案正在使用一样,我找不到任何关于允许任意参数的信息。

编辑:

找到了一个不使用 Rewrite Map 的更好的解决方案。我之前曾尝试过类似的规则,但由于我们测试环境中的 IIS 设置,它没有按预期工作。这个版本应该适用于大多数人。

<rule name="Curricula View" stopProcessing="true">
    <match url="/file(?:/(\d+)(?:/(\d+))?)?" />
    <action type="Rewrite" url="/dir1/dir2/filename.php?id={R:1}&alt={R:2}" appendQueryString="true" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
</rule>
4

1 回答 1

1

使用这条规则,我可以完全避免使用重写映射。我最初曾尝试使用类似的东西,但由于我们测试环境的设置,如果没有一些奇怪的调整,它就无法工作。这个版本应该可以在所有正常环境下工作。

<rule name="Curricula View" stopProcessing="true">
    <match url="/file(?:/(\d+)(?:/(\d+))?)?" />
    <action type="Rewrite" url="/dir1/dir2/filename.php?id={R:1}&alt={R:2}" appendQueryString="true" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
</rule>

编辑:我还能够获得带有重写地图的原始版本,适用于任何感兴趣的人。

<rule name="Rewrite Map with Variables" enabled="true">
    <match url="^(.+?)/?/(.*)$" />
    <conditions logicalGrouping="MatchAny" trackAllCaptures="false">
        <add input="{ProductMap:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="/dir1/dir2/filename.php?id={C:0}&amp;other={R:2}" appendQueryString="true" />
</rule>
于 2014-08-11T13:15:47.683 回答