我已经对特定目录进行了重写,但不知道如何使搜索结果重写起作用。
如果直接转到/blog/?s=coffee
,则会转到正确的搜索结果页面。但是由于其他 URL 重写,搜索结果页面正在尝试转到/?s=coffee/
。
动态内容部分让我很困惑。我尝试了很多方法,但最新的
<rule name="Redirect long query string" stopProcessing="true">
<match url="^?s=(.*)$" />
<action type="Rewrite" url="blog/?s=$1" appendQueryString="false" />
</rule>
我不知道自己在做什么。其他重写工作顺利完成真是个奇迹。
答案1
很抱歉给您带来坏消息,但您的重写规则对您没有任何帮助。<match>
标签中的正则表达式无效。首先,查询字符串不是 URL 的一部分,并且要匹配?
正则表达式中的,您必须使用,\?
因为?
在正则表达式中具有特殊含义。
而且,您重写的语法url
无效。您不能使用$1
反向引用,而应该使用{R:x}
(反向引用 URL)或{C:x}
(反向引用条件),其中x
是您要引用的正则表达式部分的编号。
不幸的是,我不太清楚您想要实现什么。我猜您试图将s=<something>
查询字符串中以 开头的所有请求重写为/blog/?s=<something>
。如果是这样,那么此规则应该这样做:
<rule name="Rewrite search queries" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{QUERY_STRING}" pattern="^s=([^&.]*)&?" />
</conditions>
<action type="Rewrite" url="blog/?s={C:1}" appendQueryString="false" />
</rule>
为了简单起见,s=<something>
需要作为查询字符串的第一个参数。
如果您想做其他事情,请编辑您的问题并提供更多 URL 示例以及如何重写它们。
更新:如果您需要使用搜索表单site.com/blog/?s=
,为什么site.com/?s=
不简单地更改搜索表单的 HTML?只需更改action
该表单的。
要使上述规则与 WordPress 重写规则协同工作,您必须对其进行一些修改。首先,您必须删除stopProcessing="true"
并为了安全起见,修改url
并<action>
添加前导斜杠。可能不是真的必要,只是为了确保万无一失。
因此重写规则将变成:
<rule name="Rewrite search queries">
<match url=".*" />
<conditions>
<add input="{QUERY_STRING}" pattern="^s=([^&.]*)&?" />
</conditions>
<action type="Rewrite" url="/blog/?s={C:1}" appendQueryString="false" />
</rule>
并确保此规则位于 WordPress 重写规则之上。WordPress 规则应该是最后的规则。
答案2
我发现了另一种更简单的方法(至少目前如此)来实现同样的效果在我的主题中使用自定义搜索表单。我确信这个问题将来会出现,但只要这是网站所需的唯一搜索,它就会起作用。我想有某种方法可以允许多个搜索表单,就像您可以拥有多个类别存档页面(如searchform-[slug].php
)一样,所以稍后会尝试一下。
我仍然有兴趣了解如何通过 IIS 实现这样的事情,>>此解决方案<<解决了我的问题。