Как я могу использовать ISAPI-Rewrite для перезаписи URL, только если существует перезаписанный целевой URL? - PullRequest
0 голосов
/ 14 января 2011

Или наоборот, как я могу переписать URL, только если он не существует?например, перехват 404.

Вот контекст: мы медленно переводим наш сайт с классического ASP на ASP.NET.Медленно я имею в виду преобразование 9000+ .asp страниц по одной странице за раз в .aspx.

При этом мы хотим предотвратить любые неработающие ссылки, а также не потерять ни одного рейтинга в поисковых системах.Это означает, что все наши URL-адреса .asp должны продолжать существовать, даже если они будут обслуживаться страницами .aspx.

То, что я хотел бы сделать, - это иметь правило (правила) ISAPI-Rewrite, которое будет перезаписываться.asp -> .aspx, если целевой URL фактически не существует, и в этом случае он просто запустится и вернет .asp.

Так что, если мы еще не конвертировали somepage.asp в .aspx, URL-адрес будетне будет переписано и somepage.asp будет отображаться.Как только somepage.asp исчезнет, ​​URL-адрес будет переписан на somepage.aspx, который будет выполнен и возвращен, но веб-браузер / поисковая система будет думать, что он получил somepage.asp.

В какой-то момент в будущем мы установим канонический URL на страницах .aspx и позволим поисковым системам наверстать упущенное.

Примечание: у меня естьЭкспериментировал с использованием пользовательского 404 в IIS для проверки файловой системы и выполнения Server.Transfer, если целевая страница .aspx существует, однако вы не можете перейти с asp classic на asp.net.(Вы получаете "Указанный параметр 'Page Language =" c # "' неизвестен или недействителен. Ошибка '8000d001'") Единственный способ, которым это сработало бы, это если бы мы сделали перенаправление 301/302 вместо Server.Transfer, и этонежелательно для нас в это время.(Управление параноидально и говорит, что это не вариант.)

Ответы [ 2 ]

0 голосов
/ 17 января 2011

Я понял это.Как предположил Крис Хаас, если я сделаю свой обработчик 404 страницей .aspx, то я смогу выполнить Server.Transfer, когда целевая страница существует, а если нет, просто провалиться и позволить вернуть обычный статус 404.Так что-то вроде этого:

<%@ Page Language="c#" %>

<%@ Import Namespace="System.IO" %>
<script RunAt="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        String requestedUrl = Request.ServerVariables["HTTP_X_REWRITE_URL"];

        if (requestedUrl.EndsWith(".asp", StringComparison.CurrentCultureIgnoreCase)) {
            String targetUrl = requestedUrl + "x";
            String targetPath = Server.MapPath(targetUrl);

            if (File.Exists(targetPath)) {
                Server.Transfer(targetUrl);
            }
        }
        Response.Status = "404 Not Found";
    }

</script>

Мне все еще нужно протестировать его с помощью строк запросов, но пока он отлично справляется с каждым случаем.Когда придет время и с управлением все будет в порядке, мы просто перестанем выполнять Server.Transfer и изменим его на 301 Moved Permanently.С IIS, способным устанавливать страницы ошибок для каждого каталога, мы можем даже быть несколько избирательными в отношении того, когда мы это делаем.

Между прочим, похоже, что ISAPI_Rewrite 3 может иметь опцию проверки файлов, которая также могла бы работать, но у нас есть толькоv2 на нашем сервере.

0 голосов
/ 14 января 2011

Лично, если контент перемещается, вы захотите написать процесс, который выполняет перенаправление 301, чтобы указать, что страница была перемещена в новое место.Это действительно так.

Это гарантирует, что новый контент будет проиндексирован и соответствующим образом связан.

...