web-dev-qa-db-ja.com

nginxでエイリアスディレクティブを適切に構成するにはどうすればよいですか?

Nginxウェブサーバーで複数のウェブアプリを設定しようとしていますが、1つを動作させることができませんLaravel $ document_rootをlaravelパブリックフォルダーに設定する必要があるアプリ。私は現在、エイリアスディレクティブを使用して構成しようとしていますが、あいまいな理由でこれは機能しません。これが私がやろうとしていることです。

# Default server configuration
#
server {
    listen 80;

    # SSL configuration
    #
    listen 443 ssl;

    error_log /var/log/nginx/error.log warn;

    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;


    set $root_path '/var/www/html';
    root $root_path;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html index.php;

    server_name localhost;

    location /paperwork {
        alias /var/www/html/paperwork/frontend/public;
        try_files $uri $uri/;
        #location ~ \.php {
        #   fastcgi_split_path_info ^(.+\.php)(.*)$;
        #   fastcgi_pass unix:/var/run/php5-fpm.sock;
        #   include /etc/nginx/fastcgi_params;
        #   #fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        #   #fastcgi_intercept_errors on;
        #}
    }

    #location @paperwork {
    #   rewrite /paperwork/(.*)$ /paperwork/index.php/$1 last;
    #}

    location / {

    }


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

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

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        # With php5-cgi alone:
        #fastcgi_pass 127.0.0.1:9000;
        # With php5-fpm:
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #try_files $uri $uri/ =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }



    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one

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

「エイリアス」構成をテストするために、「test.php」ファイルを/var/www/html/paperwork/frontend/public/test.phpに配置し、 https:// IP/paperwork)経由でアクセスしようとしました。 /test.php 。 404エラーが発生し、nginxエラーログには何も表示されません。ブラウザで https://IP/paperwork/frontend/public/test.php を試してみると、エラーなしでtest.phpファイルが表示されます。 phpの場所にあるtry_files行のコメントを解除しても何も変わりません。

Test.phpを/var/www/html/paperwork/test2.phpにコピーして https://IP/paperwork/test2.php にアクセスすると、ファイルはエラーなしで表示されるので、確認できます。ここでは、事務処理のパブリックディレクトリにtest2.phpがないため、エイリアスが機能していません。

事務処理場所内のphp場所のコメントを解除すると、異なる動作をする可能性があります。これにより、 https://IP/paperwork/test.php のようなリクエストでは、404ではなく空白の画面が表示されます。

私はこれに関連する多くのフォーラム/質問を経験しましたが、test.phpを表示するような単純なタスクのための動作する設定を取得できませんでした...

ありがとう!

10
Lich4r

私は解決策を見つけました。 phpファイルに対して間違ったリクエストが送信されたようです。エイリアスを使用する場合は、$ fastcgi_script_nameの代わりに$ request_filenameを使用することをお勧めします。

これが私のロケーションブロックです:

location /paperwork {

      alias /var/www/html/paperwork/frontend/public;
      #try_files $uri $uri/;
      location ~ \.php$ {
          fastcgi_pass unix:/var/run/php5-fpm.sock;
          include fastcgi_params;                       
          fastcgi_param SCRIPT_FILENAME $request_filename;
          #fastcgi_intercept_errors on;
      }
}

これにより、 https://IP/paperwork/test.php に到達している間に実行される 'test.php'ファイルの問題が解決しました。したがって、エイリアスは機能しており、phpは適切に実行されます。 'index.php'(これは私のlaravel app index)に到達しようとすると、まだ問題があります。ファイルは見つかりましたが、実行する代わりにダウンロードされます。したがって、到達すると https://IP/paperwork/index.php index.phpファイルであるログインファイルがダウンロードされます。/paperwork/index.php/loginまたは/ paperwork/loginを試しても同じ動作になります。

33
Lich4r