2

ユーザーがログインしているか、ファイルが公開されているかを確認し、Response.WriteFile を介して PDF をブラウザにプッシュするページがあります。

Google がファイルをインデックスに登録してからファイルを削除する場合を除いて、うまく機能します。そこで、410 Gone を Response.Status に追加してから、error.aspx ページにリダイレクトすることを検討しています。

Firebug は、ファイルが削除されるとドキュメント ページに "302 Found" ステータス コードが表示されると教えてくれました。410を期待しています。

リダイレクト コードは次のとおりです。

Response.Status = "410 Gone";
Response.AddHeader("Location", Request.Url.ToString());
Response.Redirect("error.aspx");

誰かが私が間違っていることを教えてください。

4

5 に答える 5

5

リダイレクションは、301 Moved Permanently や 302 Found など、リソースが別の場所で利用可能であることを示すステータスを送信することによって行われます。同じ応答で 2 つのステータス コードを送信することはできません。要求されたリソースが存在しない (410 を送信する) か、別の場所に存在する (301 または 302 などを送信する) かのいずれかです。

ただし、エラー ページにリダイレクトする必要はないと思います。エラー メッセージは、独自の URL を持つ個別のリソースではないためです。クライアントがファイルを要求し、ファイルが存在しない場合は、応答本文としてエラー メッセージを含む 410 Gone ステータスを送信します。これにより、存在しないファイル自体の URL からエラー メッセージが返されます。検索エンジンはステータス コードを見て、ファイルがなくなったことを認識し、ブラウザはユーザーがエラー メッセージを読めるように応答本文を表示します。

于 2012-03-07T01:09:34.807 に答える
1

410 Goneの仕様を見ると、「転送アドレスが不明」と記載されているため、リダイレクトは有効ではないようです。error.aspx人間のユーザーに何かを見せたい場合は、その応答で同じ本文を返すことができます。

要求されたリソースはサーバーで使用できなくなり、転送先アドレスも不明です。この状態は永続的であると考えられています。リンク編集機能を持つクライアントは、ユーザーの承認後に Request-URI への参照を削除する必要があります。状態が永続的かどうかをサーバーが認識していないか、判断する機能がない場合は、代わりにステータス コード 404 (Not Found) を使用する必要があります。特に明記しない限り、この応答はキャッシュ可能です。

410 応答は、主に、リソースが意図的に利用できないこと、およびサーバーの所有者がそのリソースへのリモート リンクを削除することを望んでいることを受信者に通知することにより、Web メンテナンスのタスクを支援することを目的としています。このようなイベントは、期間限定の販売促進サービスや、サーバーのサイトでもはや働いていない個人に属するリソースによく見られます。永久に利用できないすべてのリソースを「なくなった」とマークしたり、マークを一定期間保持したりする必要はありません。これはサーバー所有者の裁量に任されています。

于 2012-03-07T03:33:15.087 に答える
0

これが、私が 301 移動された永続的な応答を行う必要があった方法です。似てるはず

    //in Global.asax.cs
    protected virtual void Application_BeginRequest (Object sender, EventArgs e)
    {
        if(Request.Url.Host=="www.earlz.biz.tm" || Request.Url.Host=="earlz.biz.tm" || Request.Url.Host=="www.lastyearswishes.com"){
            Response.Status = "301 Moved Permanently";
            Response.AddHeader("Location","http://lastyearswishes.com"+Request.Url.PathAndQuery);
            CompleteRequest(); //I believe this is the missing piece in your code.
        }

    }
于 2012-03-07T00:58:15.547 に答える