Назад | Перейти на главную страницу

Вернуть ошибку 503 вместо 404

Мы переместили приложение на другой сервер и отключили сайт в IIS на старом сервере. Похоже, что все еще есть поисковые роботы (Googlebot, Baidu и т. Д.), Которые пытаются использовать старый IP-адрес, поэтому они получают ошибку 404. Мы бы предпочли, чтобы они получили ошибку 503, чтобы они повторили попытку позже, что даст DNS больше времени для распространения. Есть ли простой способ сделать это с помощью IIS6?

Сегодня вечером я переношу несколько веб-сайтов на новый сервер, с IIS 6 (сервер Windows 2003) на IIS 7.5 (Windows 2008 Server), с изменением IP-адресов, а также беспокоился о поисковых роботах. Друг отметил, что если я отключу пул приложений на старом сервере и оставлю веб-сайты включенными, все сайты будут возвращать 503 кода ошибки, даже если вы попытаетесь получить к ним доступ с помощью IP-адресов, пока DNS не будет распространяться. Кажется, отлично работает.

(Я знаю, что это запоздалый пост, но я часами искал решение, подобное этому, поэтому решил добавить его сюда.)

Вы можете создать универсальную страницу и добавить следующий asp-код:

context.context.Response.StatusCode =
(int)HttpStatusCode.ServiceUnavailable;

Это работает в IIS 6 и IIS 7.
Это для моего конкретного магазина (ASPDotNetStorefront), изменяйте по своему усмотрению.

web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <customErrors defaultRedirect="/404handler.asp" mode="On" />
    </system.web>
</configuration>

404handler.asp

<%@ Language=VBScript %>
<%
Option Explicit

Sub Redirector()
    Dim strRequest
    Dim strRedirect
    Dim strServer
    Dim objRegExp
    Dim tokens

    strServer = "http://mynewurl.example.com"

    strRequest = Request.QueryString("aspxerrorpath")
    If StrComp(strRequest, "") = 0 Then
        strRequest = Request.QueryString
        strRequest = Mid( strRequest, Instr( Instr(1, strRequest, "://") + 3, strRequest, "/"))
    End If

    Set objRegExp = New RegExp
    objRegExp.IgnoreCase = True

    'Product Page
    objRegExp.Pattern = "^/p-[0-9]+-.*\.aspx$"
    If objRegExp.Test(strRequest) Then
        strRedirect = strServer + strRequest
        Call DoResponse(strRedirect)
    End If

    'Product Print Page
    objRegExp.Pattern = "^/print-([0-9]+)-(.*)\.aspx$"
    Set tokens = objRegExp.Execute(strRequest)
    If tokens.Count > 0 Then
        strRedirect = strServer + "/p-" + tokens(0) + "-" + tokens(1) + ".aspx?print=1"
        Call DoResponse(strRedirect)
    End If

    'Product Email Page
    objRegExp.Pattern = "^/email-([0-9]+)-(.*)\.aspx$"
    Set tokens = objRegExp.Execute(strRequest)
    If tokens.Count > 0 Then
        strRedirect = strServer + "/p-" + tokens(0) + "-" + tokens(1) + ".aspx"
        Call DoResponse(strRedirect)
    End If

    ' Signin Page
    objRegExp.Pattern = "^/signin.aspx(\?.*)?$"
    Set tokens = objRegExp.Execute(strRequest)
    If tokens.Count > 0 Then
        strRedirect = strServer + strRequest
        Call DoResponse(strRedirect)
    End If

    'Manufacturer Page
    objRegExp.Pattern = "^/m-[0-9]+-.*\.aspx(\?.*)?$"
    If objRegExp.Test(strRequest) Then
        strRedirect = strServer + Replace(strRequest, "CatID", "FilterID", 1, -1, vbTextCompare)
        Call DoResponse(strRedirect)
    End If

    'Category Page
    objRegExp.Pattern = "^/c-[0-9]+-.*\.aspx(\?.*)?$"
    If objRegExp.Test(strRequest) Then
        strRedirect = strServer + Replace(strRequest, "ManID", "FilterID", 1, -1, vbTextCompare)
        Call DoResponse(strRedirect)
    End If

    'Other ASPX Pages
    objRegExp.Pattern = "^/.*\.aspx(\?.*)?$"
    If objRegExp.Test(strRequest) Then
        Dim Message, a
        Message = "Original request was: " + strRequest + vbCrLf + vbCrLf + "Info:"
        Message = Message + vbCrLf + "  " + Request.ServerVariables("ALL_HTTP")
        Message = Message + vbCrLf + "  Client: " + Request.ServerVariables("REMOTE_ADDR")
        Call SendEmail("me@example.com", "no-reply@oldserver.example.com", "Missed ASPX 404 Error", Message)
        'Response.Write(Message)
    End If

    ' Ignore errors for non-aspx pages
End Sub

Sub SendEmail(seTo,seFrom,seSubject,seBody)
    on error resume next
    Dim EmailObj, iConf, Flds
    Set EmailObj = Server.CreateObject("CDO.Message")
    Set iConf = CreateObject("CDO.Configuration")
    Set Flds = iConf.Fields
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "localhost"
    Flds.Update
    EmailObj.Configuration = iConf
    EmailObj.From = Chr(34) & seFrom & Chr(34) & Chr(60) & seFrom & Chr(62)
    EmailObj.ReplyTo = Chr(34) & seFrom & Chr(34) & Chr(60) & seFrom & Chr(62)
    EmailObj.Subject = seSubject
    EmailObj.Fields.Update
    EmailObj.TextBody = seBody
    EmailObj.To = Chr(34) & seTo & Chr(34) & " <" & seTo & ">"
    EmailObj.Send
    Set EmailObj = nothing
    on error goto 0
End Sub

 Sub DoResponse(strRedirect)
    If StrComp(strRedirect, "") <> 0 Then
        Response.Status = "301 Moved Permanently"
        Call Response.AddHeader("Location", strRedirect)
        Call Response.Write("<html><head><title>Page moved</title></head>")
        Call Response.Write("<body><h1>Page Moved</h1>")
        Call Response.Write("This page may be found at <a href=""" & strRedirect & """>" & strRedirect & "</a>.")
        Call Response.Write("</body></html>")
        Call Response.End
    End If
End Sub

Call Redirector()
    Response.Status = "404 File not found"
%><?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
    <title>The Page Cannot be Found</title>
    <meta name="robots" content="noindex"></meta>
    <style>
    <!--
    BODY {
        FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
    }
    H1 {
        COLOR: #cd5c5c
    }
    H2 {
        COLOR: #cd5c5c
    }
    TABLE {
        WIDTH: 540px
    }
    -->
    </style>
    </head>
    <body>
        <table>
            <tr>
                <td>
                <h1>The Page Cannot be Found</h1>
                <hr />
                <h2>Potential Causes:</h2>
                <ul>
                    <li>The requested file has been deleted.</li>
                    <li>The requested file has never existed.</li>
                    <li>The requested file is temporarily unavailable  due to maintenance, upgrades, or other similar reasons.</li>
                    <li>The requested file has moved, and we didn't automatically forward to the new page.</li>
                </ul>
                <hr />
                <h2>Please try the following:</h2>
                <ul>
                    <li>If you typed the page address into the web browser, make sure that you spelled it correctly.</li>
                    <li>Open the <a href="http://mynewurl.example.com/">home page</a> of this site.</li>
                    <li>Click the Back button to try another link.</li>
                </ul>
                <hr />
                <h2>HTTP 404 - File not found</h2>
                </td>
            </tr>
        </table>
    </body>
</html>

Знаете, что было бы намного проще? Поместите это в /robots.txt до тех пор, пока вы не хотите, чтобы ваши сайты сканировались роботами поисковых систем:

User-Agent: *
Disallow: /