0

さまざまなサブディレクトリ内から静的コンテンツを提供するための解決策を見つけようとして、あちこちを検索してきました。これが私の言いたいことです。すべての静的コンテンツは次の場所にあります。

/usr/share/nginx/www/www.example.com/skin/

画像、JavaScript ライブラリ、スタイル シート:

/usr/share/nginx/www/www.example.com/skin/css/

/usr/share/nginx/www/www.example.com/skin/img/

/usr/share/nginx/www/www.example.com/skin/js/

これらの各ディレクトリcssには、他imgjsも多数のサブディレクトリがあります。

問題: サーバー構成を見ると、すべての要求が、要求された URI に基づいて適切なコンテンツを動的にロードする autoloader.php を含む index.phtml によって処理されていることがわかります。

私が直面している問題は、相対パスを持つ静的コンテンツが動的 URL に読み込まれないことです。

つまり、JavaScript ライブラリへの相対パス:skin/js/library/helloWorld.js

これは機能します: https://www.example.com/skin/js/library/helloWorld.js

これは機能しません:

https://www.example.com/foo/skin/js/library/helloWorld.js

https://www.example.com/foo/bar/skin/js/library/helloWorld.js

URL は完全に動的であるため、/skin/{...} の前に任意の数のサブディレクトリを含む静的コンテンツを提供できる必要があります。

https://www.example.com/ {任意の数の動的サブディレクトリ}/skin/js/library/helloWorld.js

私の質問:{any number of dynamic sub-directories} $uri を変更して、 /skin/{...} からhttps://www.example.com/skin/ {...} までのすべて を省略して書き換えることは可能ですか?

location ^(.*)/skin/(.*)\.(jpeg|jpg|gif|png|ico|svg|css|js)$ {
    # Something like:
    # rewrite ^ https://www.example.com/skin/{requested static content} break;
    # or 
    # try_files /skin/{requested static content};
}

私のサーバー構成:

server {
    listen 80;
    server_name example.com www.example.com;
    rewrite ^ https://www.example.com$uri permanent;
}

server {
    listen 443 default_server ssl;

    add_header Strict-Transport-Security max-age=31536000;
    add_header X-Frame-Options SAMEORIGIN;

    root /usr/share/nginx/www/www.example.com;
    index index.phtml;

    server_name example.com www.example.com;

    if ($host !~* ^www\.) {
        rewrite ^ https://www.example.com$uri permanent;
    }

    location ^~ /autoloader.php {
            deny all;
    }

    location / {
            try_files $uri $uri/ /index.phtml;
    }

    error_page 500 502 503 504 404 403 /error.phtml;
}

可能な解決策

これらは私が避けたい解決策です:

  • 静的コンテンツのリンクには絶対パスを使用してください。(ドメイン名の変更には不向き)
  • locationサーバー構成の /skin/ にサブディレクトリごとに追加します。(動的ではありません)
  • index.phtml 内の静的コンテンツ リクエストを解析します。(むずかしそうですね…)

長い投稿で申し訳ありません。自分の状況を明確にしたかっただけです。みんなありがとう!

4

2 に答える 2

1

TIL: コーヒーとちょっとした休憩で不思議なことが起こります (笑)。

これは、同じ答えを探してこの投稿に出くわす可能性のあるすべての人のための解決策です.

相対パスを使用して静的コンテンツ (つまり、HTML ページ内の画像) をリンクする場合:

<img src="skin/img/helloWorld.jpg" />

index.html 内にあり、https: //www.example.com から参照されている画像は、次のように URL の末尾に相対パスが追加されるため、正しく読み込まれます。

https://www.example.com/skin/img/helloWorld.jpg

しかし、インデックスをサブディレクトリに移動する場合は、次のように言います。

https://www.example.com/sub-directory/index.html

リクエストが次のようになるため、画像は読み込まれません。

https://www.example.com/sub-directory/skin/img/helloWorld.jpg

ディレクトリは 1 レベル下にあるためskin、リクエストは 404 になります。

解決

前の例のように、任意のサブディレクトリから静的コンテンツを正しく参照するには:

https://www.example.com/sub-directory/category/post/id/index.html

/skin/img/helloWorld.jpg相対パスとして使用:

<img src="/skin/img/helloWorld.jpg" />

相対パスの/最初にある は、Web ディレクトリの ROOT から開始し、そこから正しいファイルを見つけようとすることを意味します。この場合、index.html がどこにあるかに関係なく、画像へのパスが 10 ディレクトリの深さであっても、常に次のようになります。

https://www.example.com/skin/img/helloWorld.jpg

したがって、相対パスに注意してください:skin/img/helloWorld.jpg/skin/img/helloWorld.jpgは異なる方法で処理されます。

于 2013-07-23T06:36:42.363 に答える
0

静的ファイル要求を正しいディレクトリに書き換えます。たとえば、次のようになります。

location ^(.*)/skin/(.*)\.(jpeg|jpg|gif|png|ico|svg|css|js)$ {
    rewrite "^.*/skin/(.*)$" /skin/$1 break;
}
于 2013-07-23T04:59:41.147 に答える