Request オブジェクトの内容について説明する場合、検討すべきコレクションの 1 つは ServerVariables コレクションです。このセットには、ページ要求とともにクライアントからサーバーに送信される HTTP ヘッダーの値と、サーバー自体が要求を受信したときに提供する値の組み合わせが含まれます。
ServerVariables コレクションの「自己参照」ページ
によって返される値には、
Web サーバーの詳細と現在のページのパス情報が含まれています。この情報は、ページを作成するどこでも使用できます。たとえば、別のタスクを完了するために自分自身を再度呼び出すことができる「自己参照」ページを作成するには、次のコードを使用できます:
<FORM ACTION="<% = Request.ServerVariables("PATH_INFO") %>" METHOD= "POST ">
HTTP "SCRIPT_NAME" 値でも同じ効果が得られます。
<FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
<A> 要素を使用して、別のページを開くと、次のものが使用できます。
...
<%
strFullPath = Request.ServerVariables("PATH_INFO")
'ファイル名を削除します
strPathOnly = Left(strFullPath, InStrRev(strFullPath, “/”))
strNextPage = strPathOnly & “pages/next_page.asp”
%>
...
<A HREF=”<% = strNextPage %>”>次のページ</A>
...
これらの例は、現在のページのパス情報が使用されるため、元のページの名前や場所が変更された場合でも機能します (もちろん、デタッチされたターゲット ページの名前が変更されると 2 番目の例は失敗します)。
つまり、URL が検索エンジンのサブセッション用に自動的に構築される場合、ServerVariable のいくつかの値を収集できます:
strFullURL = http:// & Request.ServerVariables("LOCAL_ADDR") _
& ":" & Request.ServerVariables("SERVER_PORT") _
& Request.ServerVariables("PATH_INFO")
これにより、ポート番号 (この場合、標準値の 80 ではありません) を含む完全な URL が作成されます。たとえば、結果は次のようになります。
http://194.74.60.254:1768/thispath/thispage.asp
ブラウザのバージョンの検出
ServerVariables コレクションのもう 1 つの有用な値は、ユーザーのブラウザのユーザー エージェント文字列です。 「ブラウザーの種類の検出」ページ (browsertype.asp) では、ServerVariables コレクションの「HTTP_USER_AGENT」値を使用してユーザー エージェント文字列を取得し、この情報を解析して製造元名とブラウザーのバージョンを検索するためにいくつかのスクリプトが使用されます。
<%
strUA = Request.ServerVariables("HTTP_USER_AGENT")
Response.Write “ユーザーエージェント文字列は<B>” & strUA & “</B>
」
If InStr(strUA, “MSIE”) then
応答。「ブラウザをアップグレードするには、「_」にアクセスしてください
& “<A HREF=” & Chr(34) & http://www.microsoft.com/ie/ ”_
& Chr(34) & “> http://www.microsoft.com/ie/ <A>
」
intVersion = Cint(Mid(strUA, InStr(strUA, “MSIE”) + 5, 1))
intVersion >=4 の場合
Response.Write「Microsoft Dynamic HTML を使用できます」
終了の場合
それ以外
If InStr(strUA, “Mozilla”) then
InStr(strUA, “互換性;”) = 0 の場合
Response.「あなたのブラウザはおそらく Navigator です。」と書いてください。
& 「Navigator の最新バージョンを「_」からダウンロードします
& “<A HREF=” & Chr(34) & http://home.netscape.com/ ”_
& “download/”& Chr(34) & “> http://home.netscape.com ”_
&「/ダウンロード/</A>」
」
intVersion = Cint(Mid(strUA, InStr(strUA, “/”) +1, 1))
intVersion >= 4 の場合
Response.Write 「おそらく Netscape ダイナミック HTML を使用できるでしょう」
終了の場合
それ以外
strVersion = Mid(strUA, InStr(strUA, “互換性;”) + 12)
strProduct = Left(strVersion, InStr(strVersion, “ “))
応答。「お使いのブラウザは Navigator と互換性があります。」_ と書いてください。
& 「検索エンジンを使用してメーカーを検索します。」_
& “<A HREF=” & Chr(34) _
& “http://www.altavista.digital.com/cgi-bin/query?q=”_
&strProduct_
& Chr(34) & “> http://www.altavista.com/ </A>
」
終了の場合
終了の場合
終了の場合
%>
IE 5.0 と Navigator 4.61 の検索結果はそれぞれ異なります。他のメーカーのブラウザの場合は、Alta Vista Web サイトでメーカー名の検索を自動的に開始するリンクを取得できます。
Netscape はユーザー エージェント文字列にメーカー名を提供しないため、ブラウザが Navigator であるという絶対的な保証はないことに注意してください。
ブラウザの言語の検出
ServerVariables コレクションのもう 1 つの便利な値は「HTTP_ACCEPT_LANGUAGE」です。これには、ブラウザのインストール時に指定されるか、ユーザーの地域バージョンにハードコーディングされた言語コードが含まれます。言語コードの例としては、en-us (英国、米国)、de-at (ドイツ、オーストラリア)、es-pe (スペイン、ペルー) があります。
言語コードは一般的なもので、方言識別子を省略することができます。たとえば、私たちのサイト Wrox では、多くの訪問者が言語コードとして en (英語) を使用しています。
したがって、言語コードが検出され、適切な地域固有または言語固有のバージョンのページが自動的にロードされます。
StrLocale = Lcase(Left(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"),2))
大文字と小文字の区別 strLocale
ケース「en」: Response.Redirect 「http://uk_site.co.uk/」
ケース「de」: Response.Redirect 「http://de_site.co.de/」
ケース「fr」: レスポンス.リダイレクト「http://fr_site.co.fr/」
'...等
それ以外の場合: Response.Redirect "http://us_sitel.com/"
特定の方言に基づいてページを
選択
またはリダイレクトします:strLocale = Lcase(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"))
大文字と小文字の区別 strLocale
ケース「en-gb」: Response.Redirect 「http://uk_site.co.uk/」
ケース「en-us」: Response.Redirect 「http://us_site.com/」
ケース「es-pe」: Response.Redirect 「http://es_site2.co.pe/」
「...
それ以外の場合: Response.Redirect "http://us_site1.com/"
End Select
他の便利な ServerVariables コレクション値は、
ServerVariables コレクションの任意のメンバーにアクセスして使用し、ASP ページが要求に応答する方法を制御できます。訪問者がデフォルトのポート 80 を使用してサイトにアクセスしたか、または別のポートを使用したかを確認できます。この例では、Secure Socket Layer (SSI) アクセス (およびその他のプロトコル) を提供するポート 443 経由のアクセスを探し、適切なページにリダイレクトします。
Request.ServerVariables("SERVER_PORT") = "443") の場合
Response.Redirect "/securesite/default.asp" 'セキュリティで保護されたユーザー
それ以外
Response.Redirect “/normalsite/default.asp” '非セキュア ユーザー
ブラウザがサーバーに登録して検証される必要がある場合 (Web サーバーの IUSER アカウントで匿名でアクセスできるようにするのではなく、この問題については後の章で詳しく説明します)、ユーザー名は次のようにすることができます
。
当社と取引しているユーザーが誰なのか、またこのユーザーにページをロードするかどうかを判断するためにクエリが実行されます。たとえば、次のコードは、Administrator という名前のユーザーに対する管理リンクのみを表示します。
...
<A HREF=”dispcnfg.asp”>表示設定変更</A>
<A HREF=”dispcolr.asp”>表示色の変更</A>
<A HREF=”keyboard.asp”>キーボード設定変更</A >
<%
If Request.ServerVariables("AUTH_USER") _
= Ucase(Request.ServerVariables(“SERVER_NAME”)) & “Administrator” 次に
%>
<A HREF=”allusers.asp”>全ユーザーの管理</A>
<A HREF=”usrlogon.asp”>ログオン情報の管理</A>
<%
終了の場合
%>
...
ASP は、そのメンバーのいずれかにアクセスするまで、ServerVariables コレクションに値を入力しないことに注意してください。このコレクションのメンバーに初めてアクセスすると、IIS はそのすべてを取得します。ServerVariables コレクションは必要な場合にのみ使用してください。
その他のリクエストとレスポンスのテクニック
次に、リクエスト オブジェクトとレスポンス オブジェクトを使用するためのいくつかの便利なテクニックを見てみましょう。
· 接続、バッファリング、ページ リダイレクトの管理。
· HTTP ヘッダー、キャッシュ、および「有効期限」ページの操作。
· クライアント証明書を利用します。
· カスタマイズされたログ ファイル メッセージを作成します。
1. 接続、バッファリング、ページ リダイレクトの管理
ASP の非常に便利な機能は、ユーザーが 1 つの ASP Web ページから別の Web ページ (ASP または HTML) または別のソース ファイル (ZIP ファイルやテキストなど) にリダイレクトできることです。ファイル) )。これはユーザーには透過的であり、実際に作業を行うのはブラウザです。 Response.Redirect メソッドを使用して新しい Web ページを読み込むと、実際には特別な HTTP ヘッダーがクライアントに送り返されます。このヘッダーは次のとおりです:
HTTP/1.1 302 Object Moved
Location /newpath/newpage.asp
ブラウザはこのヘッダー情報を読み取り、Location 値の指示に従ってページを読み込みます。これは、Web ページでクライアント側の HTML <META> タグを使用するのと機能的には同じです。例:
<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=/newpath/newpage.asp">
これにより、次のような結果が得られます
。a 問題は、サーバーとユーザーの間のプロキシ サーバーが、新しいページを直接ロードするのではなく、新しいページへのリンクを含む独自のメッセージを提供する可能性があることです。また、メーカーやバージョンによっては、ブラウザも同じ動作をする場合があります。これにより、本来の透明性が失われ、エラー メッセージが表示され続けるため、ユーザーにとってサイトへのアクセスがさらに面倒になります。
テキストや HTML などのページ コンテンツを送信した後は、リダイレクト メソッドを使用できなくなります。ただし、「プロキシ サーバーの影響」を制限すると思われる 1 つの方法は、まず出力 (HTTP ヘッダーを含む) がクライアントに送信されないようにすることです。 ASP 2.0 では、バッファリングをオンにしてから、Clear メソッドを使用してバッファをクリアする必要があります:
Response.Buffer = True
'適切なページを選択するための条件:
Request.ServerVariables("SERVER_PORT") = 1856 の場合
StrNewPage = “/newpath/this_page.asp”
それ以外
StrNewPage = “/newpath/the_other_page.asp”
終了の場合
応答.クリア
Response.Redirect strNewPage
ASP 3.0 では、バッファリングがデフォルトでオンになっているため、最初の行は無視できますが、無害であり、ASP 2.0 環境でも Web ページが確実に動作することが保証されています。
このタイプの HTTP ヘッダー リダイレクトを使用するよりも、Server オブジェクトの Transfer メソッドを通じて別の Web ページを実行するように変換できる ASP 3.0 の新機能を使用する方が良いでしょう。この問題については、今後さらに検討していきます。 。
1) ASP ページ バッファー
これまで見てきたように、ASP 3.0 ページ バッファーは IIS 5.0 ではデフォルトでオンになり、以前のバージョンではデフォルトでオフになります。 Microsoft によれば、IIS 5.0 ではバッファリングにより Web ページ配信がより効率的に行われるため、バッファリングのデフォルト状態が変更されました。ほとんどの場合、これは当社には影響しません。ただし、非常に大きな Web ページがある場合、または ASP またはその他のサーバー側のコードやコンポーネントを使用して作成するのに時間がかかる Web ページがある場合は、その部分が完成したら、クライアントに対してバッチで更新できます
。 。
... ページの最初の部分を作成するコード
...
レスポンス.フラッシュ
...
... ページの次の部分を作成するコード
...
レスポンス.フラッシュ
...
場合によっては、End メソッドを呼び出して現在のコンテンツをすべてクライアントに更新し、それ以降の処理を中止することで、ページの終了前のある時点でコードの実行を停止したい場合があります。
...
... ページの最初の部分を作成するコード
strUserName = "" の場合、Response.Clear
...
... ページのこの部分の新しいバージョンを作成するコード
...
ここに、バッファリングとリダイレクトを示す 2 つの Web ページの例を示します。これらは、メインの「応答オブジェクト」ページ (sow_response.asp) からダウンロードできます。最初の Response.Redirect サンプル Web ページは、redirect.asp という名前です。バッファされたページにコンテンツを挿入し、バッファをクリアして、別の Web ページにリダイレクトします。
intLoop = 1 To 1000000 の場合
応答。「。」と書きます。
次
応答.クリア
応答.リダイレクト「show_redirect.asp」
Response.End
ターゲット ページ show_response.asp も同じジョブを実行しますが、リダイレクトは「応答オブジェクト」ホームページに戻ります。これらのページはバッファリングされており、リダイレクト前にすべての出力をクリアする必要があるため、ブラウザーには出力が表示されません。ただし、発生する各リダイレクトは、ブラウザーのステータスを観察することで確認できます。以下の図に示すように:
<img src=/u/info_img/2009-06/25/asp14.jpg>
「Response Object」ホームページで、「Response.Flush」リンクをクリックして 2 番目のサンプル Web ページを開きます。 usebuffer.asp は、文字列の各文字を単純に反復処理し、一定の遅延を伴ってクライアントにフラッシュします。これは、Web サーバーと ASP の非常に非効率的な使用法ですが、バッファリングがどのように機能するかを示しています。
<img src=/u/info_img/2009-06/25/asp15.jpg>
以下は、必要な最小限の ASP コードです。各文字をブラウザに個別に更新することに注意してください。そうしないと、文字が更新されるまでバッファに格納されます。 Web ページが完成しました:
strText = “このテキストは、“ & _ を使用してブラウザにフラッシュされました。
「<B>レスポンス・フラッシュ</B>」
」
intChar =1 の場合 Len(strText)
intWrite = 1 ~ 100000 の場合
次
Response.Write Mid(strText,intChar,1)
レスポンス.フラッシュ
次へ
2) Response.IsClientConnected プロパティ
IsClientConnected プロパティは ASP 2.0 にすでに存在しますが、信頼性がやや低くなります。正確な結果を返す前に、一部の出力をクライアントに送信する必要があります。この問題は ASP 3.0 で解決されました。このプロパティは自由に使用できるようになりました。
IsClientConnected は、ユーザーがまだサーバーに接続しており、ASP によって作成された Web ページを読み込んでいるかどうかを観察するのに便利な方法です。ユーザーが切断するかダウンロードを停止すると、バッファーの内容は IIS によって破棄されるため、Web ページの作成にサーバー リソースを無駄にする必要がなくなりました。したがって、計算に多くの時間を必要としたり、多くのリソースを使用したりする Web ページの場合は、ブラウザがオフラインかどうかをあらゆる段階で確認する価値があります
。
... ページの最初の部分を作成するコード
...
Response.IsClientConnected の場合
レスポンス.フラッシュ
それ以外
応答.終了
終了の場合
...
...ページの次の部分を作成するコード...