我的网站上有几个页面有长且不可读的 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>