web-dev-qa-db-ja.com

nginxtry_filesは末尾のスラッシュと403Forbiddenをリダイレクトします

Try_filesを使用して「スーパーキャッシュ」->ファイル->モジュールパターンを組み合わせて作成しようとしています(「スーパーキャッシュ」という用語はwordpressスーパーキャッシュと同様の方法です)から取得しています)。

キャッシュに適用できるファイルは、「cache」フォルダー内にあります。

これらの場所のいずれかにファイルが存在する場合は、ファイルを提供する必要があります。

  1. / $ cache $ uri
  2. / $ cache $ uri /
  3. $ uri
  4. $ uri /

1.キャッシュ-> 2。ファイル-> 3。パターン

    location / {
        try_files /$cache_dir$uri /$cache_dir$uri/ $uri $uri/ /index.php;
    }

アドレス 'domain.com/css/style588.css'の例

  1. /srv/www/domain.com/public_html/cache/css/style588.cssを探します
  2. /srv/www/domain.com/public_html/cache/css/style588.css/index.html&.phpを探します
  3. /srv/www/domain.com/public_html/css/style588.cssを探します
  4. /srv/www/domain.com/public_html/css/style588.css/index.html&.phpを探します
  5. 見つからない場合:/srv/www/domain.com/public_html/index.php

私はそれを以下の設定で動作させることを試みました。私は何が間違っているのですか?

nginx.confからのdomain.confが含まれています

server {
    ## index index.html index.php (defined in http block, works)

    server_name domain.com;
    root        /srv/www/domain.com/public_html;

    ## cache directory ##
    set $cache_dir 'cache';

    ## no cache if post ##
    if ($request_method = POST) {
        set $cache_dir 'null dir';
    }

    ## 1.cache -> 2.file -> 3.pattern ##
    location / {
        try_files /$cache_dir$uri /$cache_dir$uri/ $uri $uri/ /index.php;
    }

    ## .php (set cgi.fix_pathinfo=0 in php.ini, especially if php is on another machine) ##
    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

上記の設定で試した例

domain.com:(403 Forbidden)

public_html/index.phpは提供されません。

-

domain.com/non_existing_folder:(OK)

public_html/index.phpが提供されます。

-

domain.com/folder_exists_in_cache/:(OK)

public_html/cache/folder_exists_in_cache/index.htmlが提供されます。

-

domain.com/folder_exists_in_cache:(リダイレクト)(末尾のスラッシュなし)

ヘッダー301を永続的にリダイレクトします。 public_html/cache/folder_exists_in_cache/index.htmlが提供されます。

ただし、URLはdomain.com/cache/folder_exists_in_cache/と表示されます

-

ri domain.com/cache/existing_empty_folder:(403 Forbidden)

public_html/index.phpは提供されません。

-

403禁止を回避するにはどうすればよいですか(末尾にスラッシュがなく、フォルダーがキャッシュに存在する場合のリダイレクト)

フォルダにアクセス許可を設定しようとしましたが、同じ結果になりました。

ご協力いただきありがとうございます!

1
Milou

これは機能するはずです:

    location ~ \.php$ {
        try_files $uri =404;
        ...
    }
    location = / {
        try_files /nonexistent /index.php?q=$uri&$args;
    }
    location / {
        try_files $cache_dir$uri $cache_dir$uri/index.html $uri $uri/index.html /index.php?q=$uri&$args;
    }
2
sendmoreinfo