2017-11-29 11 views
1

Gitbookでサイトを構築していました。 Nginxの設定に問題がありました。基本的に、私は人々が訪問したときにbook.domain.com/book_nameという標準を作りたいと思っています。それはその特定の本にリダイレクトします。しかし、私はNginxには非常に新しく、私が書いたロケーションブロックは正しくありません。私は以下のディレクトリツリーを持っています。ロケーションブロックの選択でNginxエラーが発生する

book/ 
├── [root  4.0K] _book/ 
│   ├── [root  4.0K] gitbook/ 
│   ├── [root  5.9K] index.html 
│   └── [root  970] search_index.json 
├── [root  4.0K] book_name 
│   ├── [root  4.0K] _book/ 
│   │   ├── [root  4.0K] gitbook/ 
│   │   ├── [root  5.9K] index.html 
│   │   └── [root  568] search_index.json 
│   ├── [root  16] README.md 
│   └── [root  40] SUMMARY.md 
├── [root  45] README.md 
└── [root  40] SUMMARY.md 

フォートワースブック下_bookに言及するサイトのメインディレクトリであり、私は他の本にリダイレクトするハイパーリンクを持つことになります。 book_nameの下の_bookがブックになります。

Nginxの設定は$ uriにbook_nameが含まれていると思っていたので、$ uriの下の_bookフォルダにアクセスしてindex.htmlファイルを取得することができます。これにより、500エラーが発生します。

server { 
    listen 80; 
    listen [::]:80; 
    server_name book.domain.com; 

    location /.well-known/acme-challenge { 
     root /var/www/domain.com/book/_book; 
    } 

    return 301 https://book.domain.com$request_uri; 
} 

server { 
    listen 443 ssl; 
    listen [::]:443 ssl; 
    server_name book.domain.com; 

    ssl_certificate /etc/letsencrypt/live/book.domain.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/book.domain.com/privkey.pem; 

    root /var/www/domain.com/book; 
    index index.html; 

    location/{ 
     try_files _book/ $uri/_book/; 
    } 
} 

しかし、別の場所ブロックを追加して別の方法で書き込むことも試みましたが、動作していません。これは私に404エラーを与えるでしょう。

location /book_name { 
    root /var/www/domain.com/book_name; 
} 

私は多分それを行う正しい方法は書いていると思っていましたか?ロケーションブロックを書くときは本当に混乱していました。それを行う正しい方法は何ですか?

新規編集

私は、ページを表示する方法を見つけましたが、不気味それは正しくJSとCSSでレンダリングされません。私は以下のように変更しました:

location/{ 
    try_files $uri/_book/index.html /_book/index.html =404; 
} 

すべてのjsとcssファイルは、gitbookディレクトリの下にあります。

gitbook 
├── [root  4.0K] fonts 
│   └── [root  4.0K] fontawesome 
│    ├── [root  122K] FontAwesome.otf 
│    ├── [root  75K] fontawesome-webfont.eot 
│    ├── [root  382K] fontawesome-webfont.svg 
│    ├── [root  149K] fontawesome-webfont.ttf 
│    ├── [root  88K] fontawesome-webfont.woff 
│    └── [root  70K] fontawesome-webfont.woff2 
├── [root  103K] gitbook.js 
├── [root  4.0K] gitbook-plugin-fontsettings 
│   ├── [root  6.3K] fontsettings.js 
│   └── [root  8.4K] website.css 
├── [root  4.0K] gitbook-plugin-highlight 
│   ├── [root  2.8K] ebook.css 
│   └── [root  31K] website.css 
├── [root  4.0K] gitbook-plugin-lunr 
│   ├── [root  15K] lunr.min.js 
│   └── [root  1.6K] search-lunr.js 
├── [root  4.0K] gitbook-plugin-search 
│   ├── [root  15K] lunr.min.js 
│   ├── [root  974] search.css 
│   ├── [root  1.2K] search-engine.js 
│   └── [root  6.2K] search.js 
├── [root  4.0K] gitbook-plugin-sharing 
│   └── [root  2.8K] buttons.js 
├── [root  4.0K] images 
│   ├── [root  4.7K] apple-touch-icon-precomposed-152.png 
│   └── [root  4.2K] favicon.ico 
├── [root  51K] style.css 
└── [root  111K] theme.js 

nessaryファイルへのリンクがあります。

try_filesの後にindex.htmlを置かないと、404エラーが返されます。しかし、通常、それはcssとjsでページを読み込みます。

+0

jsファイルとcssファイルはどこにありますか? index.htmlファイルで参照されていますか? –

+0

@RichardSmith cssファイルとjsファイル用に別々の場所ブロックを記述する必要はありますか?また、try_filesをロケーションブロックに再度書き込む必要がありますか? – domsupamoe

答えて

0

index.htmlファイルは/var/www/domain.com/book/<book_name>/_book/index.htmlにあり、リソースファイルはそれに関連しています。

try_filesの現在のソリューションはインデックスファイルで動作しますが、リソースを見つけるのは得策ではありません。

index index.html; 
root /var/www/domain.com/book; 

location ~ /_book/ { 
    try_files $uri $uri/ =404; 
} 
location/{ 
    rewrite ^(.*?)/?$ $1/_book/ redirect; 
} 

最初の位置ブロックが含まれているURIを処理します。

一つの解決策は、インデックスとリソースファイルを見つけるために、単純化されたtry_files文を使用し、その後、_bookコンポーネントが含まれているURIの中にご希望のURIをリダイレクトすることです_bookコンポーネント。これは、index.htmlファイルとすべてのリソースファイルの最終URIです。

//book.domain.com/book_name//book.domain.com/book_name/_book/にリダイレクトします。

詳細はthis documentを参照してください。


次のソリューションは、それが露出URI内に表示されないように、パス名に_bookを挿入するためにaliasを使用しています。

ただし、メインディレクトリのインデックスファイルとリソースファイルのURIはあいまいです。たとえば、/gitbook/search_index.jsonはメインディレクトリのリソースファイルまたは "gitbook"という本を参照していますか? nginxでは、URIを明確にする必要があります。

したがって、次のソリューションでは、メインディレクトリのURIにのみ/_book/を使用しています。

index index.html; 
root /var/www/domain.com/book; 

location =/{ 
    return 302 /_book/; 
} 
location ^~ /_book/ { 
} 
location ~ ^/([^/]+)(/.*)?$ { 
    alias /var/www/domain.com/book/$1/_book$2; 
    if (!-e $request_filename) { return 302 /; } 
} 

this documentを参照してください。

+0

私を助けていただきありがとうございます。私は何時間もこれに固執していて、あなたのソリューションは機能しています!しかし、rewriteメソッドを使用すると、実際には望んでいないURLに_bookが表示されます。それを取り除くためにとにかくありますか?そして、なぜ私のやり方がindex.htmlを指定する必要があるのか​​、そしてインデックスとリソースを直接見つけることができないのか、私は理解できません。 – domsupamoe

+0

それは動作します。 Nginxの強力な機能を理解し始めましょう。ありがとうございました! – domsupamoe

関連する問題