Перенаправление Isapi Rewrite 301 разрешается как 404 – циклическая ссылка?
-
20-08-2019 - |
Вопрос
Я пытаюсь использовать IIS Isapi Rewrite, чтобы сделать следующее...
Мне нужно, чтобы URL-адреса, оптимизированные для SEO, были (тихо) преобразованы обратно в URL-адреса, удобные для приложений, например:
RewriteRule ^/seo-friendly-url/ /test/index.cfm [I,L]
Достаточно просто.
Но мне также нужно, чтобы URL-адреса, уже проиндексированные в поисковых системах (например), перенаправлялись с кодом 301 на оптимизированную для SEO версию.Вот так:
RewriteRule ^/test/index.cfm /seo-friendly-url/ [I,R=301]
Каждый из них прекрасно работает по отдельности.Но когда оба файла есть в моем .ini-файле, в адресной строке браузера отображается /seo-Friendly-url/, но мне выдается ошибка 404.(Да, /test/index.cfm определенно существует!)
Я знаю, что это похоже на циклическую ссылку, но первое правило перезаписывает только URL-адрес между IIS и приложением — перенаправления нет, поэтому я не нажимаю Isapi Rewrite во второй раз.Или я ошибаюсь в этом?
Я включил ведение журнала в Isapi Rewrite и вижу следующее:
HttpFilterProc SF_NOTIFY_PREPROC_HEADERS
DoRewrites
New Url: '/seo-friendly-url/'
ApplyRules (depth=0)
Rule 1 : 1
Result (length 15): /test/index.cfm
ApplyRules (depth=1)
Rule 1 : -1
Rule 2 : 1
Result (length 18): /seo-friendly-url/
ApplyRules: returning 301
ApplyRules: returning 1
Rewrite Url to: '/seo-friendly-url/'
У кого-нибудь есть идеи?
Решение 2
Путем проб и ошибок я нашел решение этой проблемы.
Укажите, что совпадение перенаправления находится в конце строки, используя символ $:
RewriteRule ^/test/index.cfm$ /seo-friendly-url/ [I,R=301]
Сделайте переписанный URL тривиально отличным от строки соответствия перенаправления - в этом случае добавьте ненужный "?":
RewriteRule ^/seo-friendly-url/ /test/index.cfm? [I,L]
Другие советы
У вас есть две разные перезаписи, и это должно сработать, если вы все сделаете правильно.
Первый из них никогда не виден клиентскому пользовательскому агенту.Он запрашивает /seo-Friendly, и вы переписываете его внутри себя и отвечаете.
Второй на самом деле не перезапись, а перенаправление.Вы отправляете это обратно клиенту, и он повторно запрашивает /seo-Friendly - я думаю, вам нужно использовать [R=301,L], чтобы сказать, что это конец строки - просто верните его (L делает что)