回答編集履歴
1
誤字修正
test
CHANGED
@@ -20,36 +20,37 @@
|
|
20
20
|
|
21
21
|
プログラムが不明なため憶測も入りますが、
|
22
22
|
|
23
|
-
このエラーが出る時はたいていJSONダウンロードに失敗し「404 NotFound」のようなエラーメッセージが発生している
|
23
|
+
このエラーが出る時はたいていJSONダウンロードに失敗し「404 NotFound」のようなエラーメッセージが発生している場合です。プログラムのエラー処理が不十分なためエラー応答文字列をJSONと見立ててデコードしようとしてこのエラーになります。
|
24
24
|
|
25
|
-
なぜ、ダウンロードに失敗するのかですが、nginxで`/audio`ディレクトリ下にあるように見せかけていることをDocker内のプログラムが認識できていないためと思います。
|
25
|
+
ではなぜ、開発環境では成功するのに本番環境でダウンロードに失敗するのかですが、nginxで`/audio`ディレクトリ下にあるように見せかけていることをDocker内のプログラムが認識できていないためと思います。
|
26
26
|
|
27
27
|
例えばJSONが`/dir/aaa.json`の場合、nginxのproxy_pass設定があるため、
|
28
28
|
|
29
29
|
/audio/dir/aaa.json
|
30
30
|
|
31
|
-
がブラウザから見た正しいリンクですが、プログラム側はそんなことは知らないため
|
31
|
+
がブラウザから見た正しいリンクです。が、プログラム側はそんなことは知らないため
|
32
32
|
|
33
33
|
/dir/aaa.json
|
34
34
|
|
35
|
-
というリンクをHTMLやJavaScriptファイルに埋め込ま
|
35
|
+
というリンクをHTMLやJavaScriptファイルに埋め込みます。ブラウザは`/dir/aaa.json`にアクセスしますがファイルを見つけられず`404 NotFound`となります。nginxの`proxy_pass`はアクセスに来たURLに応じて動作するだけなので、ブラウザに送っているファイルの中身までは書き換えてくれません。
|
36
|
-
|
37
|
-
これがローカルで動作するのにこの環境でエラーが出る原因です。
|
38
36
|
|
39
37
|
これを回避するには
|
40
|
-
1. プログラム側が`/audio/`というパス付でHTMLやJavaScriptを生成できるようにする
|
38
|
+
1. プログラム側が`/audio/`というパス付きでHTMLやJavaScriptを生成できるようにする
|
41
|
-
2. nginxの書換機
|
39
|
+
2. nginxの書換機能を使ってプログラムが生成したHTML,JavaScriptファイル内のリンクを途中で書き換える
|
40
|
+
3. `/audio/`の下に置くのはあきらめる。
|
41
|
+
|
42
|
-
の
|
42
|
+
のいずれかが必要です。
|
43
43
|
|
44
44
|
1番がお薦めですがプログラム不明なので省略します。コンテキストパスを埋め込む方法が用意されていればそれが簡単です。すべて相対パスで書く案もあります。
|
45
45
|
|
46
46
|
2のコンテンツ書換は必要なURLを書き換えできるかがカギです。静的なHTMLだけならば`href=` や `src=` を書き換えればいいので、以下を追加すればいけそうですが、
|
47
47
|
```
|
48
|
-
set $context "/
|
48
|
+
set $context "/audio/";
|
49
49
|
sub_filter_once off;
|
50
50
|
proxy_set_header Accept-Encoding "";
|
51
51
|
sub_filter 'href="/' 'href="$context';
|
52
52
|
sub_filter 'src="/' 'src="$context';
|
53
|
+
sub_filter 'action="/' 'action="$context';
|
53
54
|
```
|
54
55
|
今回はJavaScript部と思われますので一概には書けないです。
|
55
56
|
他にも良い方法があるかもしれません。
|