Nginx - 特定の URL のルート フォルダーを変更すると 404 エラーが発生する

Nginx - 特定の URL のルート フォルダーを変更すると 404 エラーが発生する

誰でも URL からアクセスできるようにロケーション ブロックを配置しmydomain.com/game/admin、コンテンツを取得する nginx サーバーが/var/www/html/my-cakephp-app/ディレクトリに存在することを確認しようとしています。私のアプリケーションは cakephp フレームワークを使用して構築されており、そのディレクトリ構造は以下のとおりです。

  • /var/www/html/my-cakephp-app/
    • 管理者
      • 設定
      • コンソール
      • コントローラ
      • ビュー
      • webroot (アプリのエントリポイント index.php ファイルはこのディレクトリに存在します)

また、ディレクトリには静的 HTML/CSS ウェブサイトも配置されています/var/www/html。そのため、mydomain.comURL を知っている人なら誰でもそのウェブサイトを見ることができます。

現在の nginx サーバー ブロックは次のとおりです。

server {
    listen 80;
    listen [::]:80;

    root /var/www/html;

    index index.html index.htm index.php;

    server_name mydomain.com;

    location / {
        try_files $uri $uri/ =404;
    }
    
    location /game/admin {
            return 301 /game/admin/;
    }

    location /game/admin/ {

                root /var/www/html/my-cakephp-app/admin/webroot;
                try_files $uri $uri/ /game/admin/index.php$is_args$args;
  
                location ~* \.php(/|$) {
                  include snippets/fastcgi-php.conf;
                  fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
               } 

    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

この設定により、静的 Web サイトは正常に動作します。ただし、cakephp アプリケーションはブラウザーで 404 見つかりませんエラーを表示します。nginx/error.log にはエラーは表示されません。

しかし、以下の nginx 構成で実行すると、アプリケーションは正常に動作します。ただし、html/css サイトを削除する必要があります。html/css アプリを wordpress サイトにアップグレードする予定です。そのため、wordpress サイトを親として実行できる必要があります。

server {
    listen 80;
    server_name mydomain.com;
    root /var/www/html/my-cakephp-app/admin/webroot;
    
    index index.html index.htm index.php;
 
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
        autoindex on;
    }
    
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
    
    location ~ /\.ht {
        deny all;
    }
}

最初のサーバー ブロックで何を間違えたのか思いつきませんでした。 何かアドバイスがあれば、本当に助かります。

答え1

主な問題は 2 つあります。

  • 外側のブロックは、修飾子を使用しない限り、ブロックlocation ~ \.php$よりも優先されます(location /game/admin/^~このドキュメント詳細については)
  • ディレクティブrootは単純な連結によってファイルへのパスを生成するので、コントローラは次の場所にあると想定されます/var/www/html/my-cakephp-app/admin/webroot/game/admin/index.phpこのドキュメント詳細については)

/var/www/html/game/admin1 つのオプションは、ディレクトリ構造が URI 構造と一致するようにプロジェクトを移動することです。これは、を指すシンボリック リンクを使用して実現でき、/var/www/html/my-cakephp-app/admin/webrootその場合、外側のlocation ~ \.php$ブロックは両方のプロジェクトを実行できます。


もう一つの選択肢はalias指令です。このドキュメント詳細については。

location ^~ /game/admin {
    alias /var/www/html/my-cakephp-app/admin/webroot;

    if (!-e $request_filename) { rewrite ^ /game/admin/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

$document_root$fastcgi_script_nameはでは機能しないのでalias、代わりに を使用する必要があることに注意してください$request_filename

私はalias、とをtry_files一緒に使うことを避けています。この問題。 見るこの注意指令の使用についてif

関連情報