Origin nullはAccess-Control-Allow-Originでは許可されていません


184

以下のコードを使用して、weather.xslというhtml出力を作成するための小さなxsltファイルを作成しました。

<!-- DWXMLSource="http://weather.yahooapis.com/forecastrss?w=38325&u=c" -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="yweather"
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <img src="{/*/*/item/yweather:condition/@text}.jpg"/>
</xsl:template>
</xsl:stylesheet>

次のように、jQueryを使用して実行しようとしているhtmlファイルのdivにhtml出力をロードしたいと思います。

<div id="result">
<script type="text/javascript">
$('#result').load('weather.xsl');
</script>
</div>

しかし、次のエラーが発生します。OriginnullはAccess-Control-Allow-Originでは許可されていません。

私はxsltにヘッダーを追加することについて読みましたが、それを行う方法がわからないので、助けがあれば幸いです。html出力にこの方法でロードできない場合は、他の方法に関するアドバイスをそれをするのは素晴らしいことです。


それはあなたの実際の load呼び出しですか?全然道がありませんか?
TJクラウダー

回答:


227

Origin nullはローカルファイルシステムであるためloadfile:///URL を介して呼び出しを行うHTMLページをロードしていることを示しています(たとえば、ローカルファイルブラウザーなどでダブルクリックするだけです)。ブラウザが異なれば、ローカルファイルに同じ生成元ポリシーを適用するためのアプローチも異なります。

私の推測では、これはChromeを使用して表示されています。SOPをローカルファイルに適用するためのChromeのルールは非常に厳しく、ドキュメントと同じディレクトリからファイルをロードすることもできません。Operaもそうです。Firefoxなどの他のブラウザでは、ローカルファイルへのアクセスが制限されています。しかし、基本的に、ローカルリソースでajaxを使用しても、クロスブラウザでは機能しません。

ローカルファイルを使用するのではなく、実際にWebに展開するものをローカルでテストするだけの場合は、http://代わりに単純なWebサーバーをインストールして、URL 経由でテストします。これにより、より正確なセキュリティ状況を把握できます。


1
アップロードした後、Origin nullを取得できなくなりましたが、「Access-Control-Allow-Originでは許可されていません」と表示されます。
dudledok

3
ロードしているリソースが($('#result').load('weather.xsl');)で示したものである場合は、リクエストが明らかに同じ発信元に対して行われているため、これは発生しません。別の場所(など$('#result').load('http://somewhere.else/weather.xsl');)からロードしようとしている場合は、再度SOPに実行していますが、方法が異なります。Ajaxリクエストは同じオリジンに制限されています(回答のリンクを参照)、またはCORS対応のブラウザーを使用していて、サーバーがCORをサポートしている場合、サーバーはクロスオリジンリクエストを許可するかどうかを選択できます。
TJクラウダー

ロードURLを変更しました。問題になっているものに戻すと、正常に読み込まれます。助けてくれてありがとう
dudledok

2
シンプルなWebサーバーを設定する最も簡単で迅速な方法は何ですか?ここでIISが最も簡単な方法でしょうか?
Ciaran Gallagher

13
@CiaranG私はpython -m SimpleHTTPServerコマンドラインから実行し、localhost:8000に移動しました。PythonはMac OS Xにプリインストールされています。別のOSを使用している場合は、インストールが必要になることがあります。
Dave Liepmann

216

ChromeとSafariでは、ローカルリソースでのajaxの使用に制限があります。そのため、次のようなエラーがスローされます

Access-Control-Allow-OriginではOrigin nullは許可されていません。

解決策: Firefoxを使用するか、データを一時サーバーにアップロードします。それでもChromeを使用したい場合は、以下のオプションから開始してください。

--allow-file-access-from-files

上記のパラメーターをChromeに追加する方法の詳細:タスクバーのChromeアイコンを右クリックし、ポップアップウィンドウでGoogle Chromeを右クリックして[プロパティ]をクリックし、[ショートカット]タブの[ターゲット]テキストボックス内に上記のパラメーターを追加します。以下のようになります。

C:\Users\XXX_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

これが役立つことを願っています!


19
Mac OS Xでは、ターミナルを開いて次のように入力することにより、このオプションでChromeを起動できます。 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files & 最後の&はターミナルを引き続き使用できるようにするためのものであり、必須ではありません。 注:ターミナルを閉じると、Chromeウィンドウが閉じます。
ブルーノバーナーディーノ

3
それをすべて行い、閉じて開きました。まだ行きません(XPではChrome 27.0.1453.116 m)
mplungjan 2013年

Windows 8でこのパラメーターを追加することはできません...、それを行う方法を知っている人は誰でも...?
Morty

私は、午前、Webサーバーから実行されています。一体何ですか?ローカルファイルがどこにロードされているのか、どうすればわかりますか?
アンディ

--allow-file-access-from-filesをターゲットパスに追加しようとすると、「.... invalid」というメッセージが表示されますが、htisソリューションはまだ有効ですか?
アレックス、2016年

48

「ウェブサーバーを実行する」という答えは非常に困難に思えますが、システムにpythonがある場合(少なくともMacOSとLinuxディストリビューションにデフォルトでインストールされている場合)、次のように簡単です。

python -m http.server  # with python3

または

python -m SimpleHTTPServer  # with python2

したがってmyfile.html、フォルダーにhtmlファイルがある場合、たとえばmydir、次の操作を行うだけです。

cd /path/to/mydir
python -m http.server  # or the python2 alternative above

次に、ブラウザで次のように指定します。

http://localhost:8000/myfile.html

これで完了です。Webセキュリティを無効にしたり、ローカルファイルを許可したり、コマンドラインオプションでブラウザを再起動したりすることなく、すべてのブラウザで動作します。


2
Windowsで対応するpython 3は次のとおりです。python
Aragorn

Pythonの3:のpython3 -m http.server
ジョアン・ヌネス

Linux上のPython 2、8080ポート(または他の任意のポート)を選択:python -m SimpleHTTPServer 8080
Rodrigo

2

私はこのSOソースhttps://stackoverflow.com/a/14671362/1743693に従って謙虚にそれを追加したいと思います。この種の問題は、次のjQuery命令を使用するだけで部分的に解決されました。

<script> 
    $.support.cors = true;
</script>

IE10.0.9200で試したところ、すぐに動作しました(jquery-1.9.0.jsを使用)。

Chrome 28.0.1500.95の場合-この命令は機能しません(これはdavidとして発生します)が上記のリンクのコメントで不平を言っているため、)

--allow-file-access-from-filesを指定してchromeを実行しても機能しません(上記のMaistoraの主張)


2

Gokhanのソリューションを使用するためのビットを追加する:

--allow-file-access-from-files

次に、上記のテキストをターゲットテキストに追加し、その後にスペースを1つ追加するだけです。上記のプロパティを追加した後は、必ずChromeブラウザのすべてのインスタンスを閉じてください。このプロパティを追加したアイコンでChromeを再起動します。それはすべてのために働くはずです。


このパラメーターは既にGhokan Tankによって提示されており、常にこのパラメーターでブラウザーを起動させる方法を見つけることは問題の一部ではありません。さらに、誰もがMicrosoft Windowsを使用しているとは限りません。
jnns 2013年

0

ローカルのhtmlファイルからサーバーにXHRリクエストを送信するソリューションを探していて、ChromeとPHPを使用するソリューションを見つけました。(jqueryなし)

JavaScript:

var x = new XMLHttpRequest(); 
if(x) x.onreadystatechange=function(){ 
    if (x.readyState === 4 && x.status===200){
        console.log(x.responseText); //Success
    }else{ 
        console.log(x); //Failed
    }
};
x.open(GET, 'http://example.com/', true);
x.withCredentials = true;
x.send();

Chromeのリクエストヘッダー Origin: null

私のPHP応答ヘッダー(「null」は文字列であることに注意してください)。HTTP_REFERERは、リモートサーバーから別のサーバーへのクロスオリジンを許可します。

header('Access-Control-Allow-Origin: '.(trim($_SERVER['HTTP_REFERER'],'/')?:'null'),true);
header('Access-Control-Allow-Credentials:true',true);

サーバーに正常に接続できました。Credentialsヘッダーは無視できますが、ApacheがAuthType Basic有効になっている場合はこれでうまくいきます

私はFFとOperaとの互換性をテストしました。以下のような多くの場合に機能します。

VM LAN IP(192.168.0.x)からVMのWAN(パブリック)
IPに戻るIP:port VM LAN IPからリモートサーバーのドメイン名に戻る。
ローカルの.HTMLファイルからVM LAN IPおよび/またはVM WAN IP:portへ
、ローカルの.HTMLファイルからリモートサーバードメイン名へ。
等々。


0

file:/ソースタグを使用して、ローカルJavascriptファイルを(ソースページの下のツリーに)読み込むことができます。

<script src="my_data.js"></script>

この場合のように、入力をJavaScriptにエンコードすると、次のようになります。

mydata.js

$xsl_text = "<xsl:stylesheet version="1.0" + ....

(これはjsonの方が簡単です)次に、Javascriptグローバル変数に「データ」を入れて、必要に応じて使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.