У меня есть перезаписи, работающие для определенных каталогов, но я не могу понять, как заставить работать переписывание результатов поиска.
Если перейти прямо к /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>
Я понятия не имею, что делаю. Это чудо, что у меня заработали другие переписчики.
Мне очень жаль, что я сообщаю вам плохие новости, но ваше правило перезаписи ничего не делает для вас. Регулярное выражение в <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 должны быть последними.
Я обнаружил гораздо более простой способ сделать то же самое (по крайней мере, на данный момент) с помощью используя настраиваемую форму поиска в моей теме. Я уверен, что эта проблема возникнет в какой-то момент в будущем, но пока это единственный поиск нужного веб-сайта, он будет работать. Я предполагаю, что есть способ разрешить несколько форм поиска так же, как у вас может быть несколько страниц архива категорий (например, searchform-[slug].php
) так что поэкспериментирую с этим позже.
Однако мне все еще интересно узнать, как это можно сделать с помощью IIS, >> это решение << решил мою проблему.