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側で大文字・小文字の区別なしに比較すればすむことなので、チェックの仕方についての回答はご遠慮ください。
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と等価です.
ですから,どのヘッダも,等価なものとして扱わなければならないということです.
回答になっていますでしょうか.
コメント(1件)
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){}