web-dev-qa-db-ja.com

Nginx-他のディレクトリにルートがある場所PHP

Nginxで「Apache Alias」のような場所を設定しようとしましたが、このフォルダでPHPスクリプトを処理できません。

これが私のフォルダ構造です(Dev環境用):

/var/www
+-  dev/public/ <-- This is my normal Web root : "/"
|   +- assets/
|   |  +- app.css
|   |  +- app.js
|   |
|   +-  index.php
|   +-  favicon.png
|    
+-  cut/public/ <-- This must like an "Apache Alias" : "/cut"
    +- assets/
    |  +- app.css
    |  +- app.js
    |
    +-  index.php
    +-  other_other_file.php (why not)

さまざまな解決策を試しましたが、どれも機能していません。

これが私の最高のNginx設定です:

server {
    listen   80;

    server_name _;
    root  /var/www/dev/public/;
    index index.php index.html;
    autoindex on;

    # Logs
    rewrite_log on;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    # Serving files
    location / {
        try_files $uri $uri/ @php;
    }

    location /cut {
        root /var/www/cut/public;
        try_files $uri $uri/ @php;
    }

    # PHP
    location @php {
        rewrite ^(.*)/?$ /index.php$is_args$args last;
    }

    location ~* \.php(/|$) {
        fastcgi_pass  php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param DOCUMENT_ROOT $document_root;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

これを使うと、私のcut/public/フォルダのすべてのコンテンツがdev/public/index.phpにリダイレクトされ、解釈されます(try_fileが原因であると思います)。

それがあなたの助けが歓迎される理由です。

最終的な解決策

@ richard-smithの回答の後、実装されたソリューションは次のとおりです。

server {
    listen   80;

    server_name _;
    root  /var/www/dev/public/;
    index index.php index.html;

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location ^~ /cut {
        rewrite ^/cut/?(.*)$ /cut/public/$1 last;
    }

    location ^~ /cut/public {
        root /var/www/;
        try_files $uri $uri/ /cut/index.php$is_args$args;

        location ~* \.php(/|$) {
            fastcgi_pass  php:9000;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            fastcgi_param DOCUMENT_ROOT $document_root;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~* \.php(/|$) {
        fastcgi_pass  php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param DOCUMENT_ROOT $document_root;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
5
Akarun

2つのPHPアプリケーションを並べて実行する場合、共通のドキュメントルートが必要か、正しいlocation ~* \.phpを保証するために2つのSCRIPT_FILENAME(または類似の)ブロックが必要ですfastcgiバックエンドに送信されます。

ネストされたlocationブロックを使用して/cutサブディレクトリを分離し、トップレベルで^~修飾子を使用して、他のトップレベルの正規表現locationブロックが干渉しないようにします( このドキュメント )。

aliasディレクティブ( このドキュメント を参照)は、/cut/var/www/cut/publicにマップするために使用されます。 rootディレクティブは連結のみ可能であり、これにより/var/www/cut/public/cutが作成されます(これは不要です)。

ただし、 この長期的な問題 のため、aliasディレクティブをtry_filesディレクティブとともに使用することはお勧めしません。

したがって、解決策は、/cut/cut/publicにサイレントに書き換え、root /var/wwwの値を使用することです。

例えば:

location ^~ /cut {
    rewrite ^/cut(.*)$ /cut/public$1 last;
}
location ^~ /cut/public {
    root /var/www;
    try_files $uri $uri/ /cut/index.php$is_args$args;

    location ~* \.php(/|$) {
        fastcgi_pass  php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
7
Richard Smith