Ajaxでの実装時のIEのリクエストヘッダについての質問です。jQueryの$.ajax()とPHPを使用。


1. $.ajax()を使ってPHPにPOST
2. PHP側でgetallheaders()を使ってリクエストヘッダを取得
3. 「X-Requested-With: XMLHttpRequest」がある場合とない場合で処理を分岐

参考までに、jQueryのソースから、$.ajax()内のリクエストヘッダを追加している部分を抜き出し。

// Set header so the called script knows that it's an XMLHttpRequest
xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");


不思議なことに、getallheaders()で取得したリクエストヘッダをvar_dump()してみると、
IE(6/7)では「x-requested-with: XMLHttpRequest」と小文字になってしまうのです。
その他のヘッダは小文字にはなっていませんし、FirefoxやOperaでは小文字にはなりません。

このリクエストヘッダが小文字になってしまう原因わかりますか?

チェック自体はPHP側で大文字・小文字の区別なしに比較すればすむことなので、チェックの仕方についての回答はご遠慮ください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/04/08 20:50:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:kent013 No.1

回答回数38ベストアンサー獲得回数7

ポイント10pt

http://www.ring.gr.jp/pub/doc/RFC/rfc2068.txt

では,


CHAR           = <any US-ASCII character (octets 0 - 127)>
CTL            = <any US-ASCII control character
                 (octets 0 - 31) and DEL (127)>
CR             = <US-ASCII CR, carriage return (13)>
LF             = <US-ASCII LF, linefeed (10)>
SP             = <US-ASCII SP, space (32)>
HT             = <US-ASCII HT, horizontal-tab (9)>
tspecials      = "(" | ")" | "<" | ">" | "@"
                | "," | ";" | ":" | "\" | <">
                | "/" | "[" | "]" | "?" | "="
                | "{" | "}" | SP | HT

token          = 1*<any CHAR except CTLs or tspecials>

message-header = field-name ":" [ field-value ] CRLF
field-name     = token

と定義されています.US-ASCIIの文字はISO/IEC 646 - Wikipediaで参照できます.そしてRFC2068には

Each header field consistsof a name followed by a colon (":") and the field value. Field names are case-insensitive.

とありますので,ヘッダは大文字小文字を区別しません.


IEが,なぜヘッダをすべて小文字にしているかはわかりませんが,仕様的には問題ありません.

FireFoxやOperaが大文字小文字を混ぜたヘッダを送ってきても,それは仕様としてはIEと等価です.

ですから,どのヘッダも,等価なものとして扱わなければならないということです.


回答になっていますでしょうか.

  • id:wizemperor
    jQueryの該当箇所のソースを補足。
    IEのActiveXObject("Microsoft.XMLHTTP")の仕様であるとすれば、根拠となる資料などを教えていただきたいと思います。


    // Create the request object; Microsoft failed to properly
    // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
    var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();

    // Open the socket
    xml.open(s.type, s.url, s.async, s.username, s.password);

    // Need an extra try/catch for cross domain requests in Firefox 3
    try {
    // Set the correct header, if data is being sent
    if ( s.data )
    xml.setRequestHeader("Content-Type", s.contentType);

    // Set the If-Modified-Since header, if ifModified mode.
    if ( s.ifModified )
    xml.setRequestHeader("If-Modified-Since",
    jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );

    // Set header so the called script knows that it's an XMLHttpRequest
    xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");

    // Set the Accepts header for the server, depending on the dataType
    xml.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
    s.accepts[ s.dataType ] + ", */*" :
    s.accepts._default );
    } catch(e){}

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません