nginx:すべてのリクエストを単一のhtmlページに送信します


156

nginxを使用して、URLを保持したいのですが、実際には同じページをロードします。History.getState()JavaScriptアプリでリクエストをルーティングするためにURLを使用します。それは簡単なことのように思えますか?

location / {
    rewrite (.*) base.html break;
}

動作しますが、URLをリダイレクトしますか?それでもURLが必要です。常に同じページを使用したいだけです。


6
この質問をしてくれてありがとう。答えはすぐにわかりました:-)
ラッセバンク

回答:


191

これでうまくいくと思います:

location / {
    try_files /base.html =404;
}

1
[emerg] 613#0:「try_files」ディレクティブの引数の数が無効ですか?
prismofeverything

2
これを試してみましょう:try_files $ uri /base.html;
Alex Howansky 2011

5
注-これは最初に要求されたファイルをチェックし、そこにない場合はbase.htmlを提供します。そのため、ドキュメントのルートディレクトリに古い余分なファイルが残っていないことを確認してください。そうしないと、照会された場合に直接提供されます。
Alex Howansky 2011

22
使い方try_files '' /base.html;(の最初の引数として空の文字列はtry_files)と呼ばれるファイルの検索を回避します$uri
davidjb 2015年

17
try_files '' /base.html;リダイレクトの問題とサーバーの内部エラーが発生しましたが、try_files '' /base.html =404;誰かを助ける場合は修正して修正しました。
William Turrell

30

を使用してもtry_filesうまくいきませんでした。ログに書き換えまたは内部リダイレクトサイクルエラーが発生しました。

Nginxのドキュメントには、いくつかの追加の詳細があります:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

だから私は次のことを使ってしまいました:

root /var/www/mysite;

location / {
    try_files $uri /base.html;
}

location = /base.html {
    expires 30s;
}

1
try_files '' /base.html =404;(上記を参照)
Marc

これでうまくいきましたが、実際には必要ありませんでしたlocation = /base.html { expires 30s }
maechler

17

元の書き換えはほとんど機能するはずです。なぜリダイレクトされるのかはわかりませんが、本当に欲しいのは

rewrite ^ /base.html break;

あなたはそれを場所に置くか、サーバーに直接置くことができるはずです。


13

これは私のために働きました:

location / {
    alias /path/to/my/indexfile/;
    try_files $uri /index.html;
}

これにより、JavaScriptの単一ページアプリのキャッチオールURLを作成できました。によって作成されたcss、フォント、JavaScriptなどのすべての静的ファイルnpm run build は、と同じディレクトリにある場合に見つかりindex.htmlます。

静的ファイルが別のディレクトリにある場合、何らかの理由で、次のようなものが必要になります。

# Static pages generated by "npm run build"
location ~ ^/css/|^/fonts/|^/semantic/|^/static/ {
    alias /path/to/my/staticfiles/;
}


7

正しい方法は次のとおりです。

location / {
    rewrite (.*) base.html last;
}

を使用lastするとlocation、書き換えの結果に応じて、nginxが新しい適切なブロックを見つけます。

try_files この問題に対する完全に有効なアプローチでもあります。

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