2016-10-31 3 views
0

私は最近、Apacheではなくnginxを実行している新しいサーバ設定に移動しました。外部で使用されている従来のコードから、/assets/js/wiget_load.js.phpを設定する必要があります。symfony 3とNginxがproduction .phpルートに404を投げています

これはApacheで動作するために使用されましたが、現在はnginxでは動作しません。私はこれを初めて知ったので、どうやってこれが起こっているのか、それがなぜnginx 404を投げているのか理解できません。これは/app_dev.php/assets/js/wiget_load.js.phpにアクセスしてもprod 。ここに私の.confファイルがあります:/assets/js/wiget_load.js.php

server { 

    listen 443 ssl; 
    ssl_certificate /etc/ssl/mydomain.chained.crt; 
    ssl_certificate_key /etc/ssl/mydomain.key; 

    server_name mydomain.com; 
    root /usr/share/nginx/html/web; 

    location/{ 
     # try to serve file directly, fallback to app.php 
     try_files $uri /app.php$is_args$args; 
    } 
    # # DEV 
    # # This rule should only be placed on your development environment 
    # # In production, don't include this and don't deploy app_dev.php or config.php 
    location ~ ^/(app_dev|config)\.php(/|$) { 
     fastcgi_pass php:9000; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 
     # When you are using symlinks to link the document root to the 
     # current version of your application, you should pass the real 
     # application path instead of the path to the symlink to PHP 
     # FPM. 
     # Otherwise, PHP's OPcache may not properly detect changes to 
     # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 
     # for more information). 
     fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 
     fastcgi_param DOCUMENT_ROOT $realpath_root; 
    } 
    # PROD 
    location ~ ^/app\.php(/|$) { 
     fastcgi_pass php:9000; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 
     # When you are using symlinks to link the document root to the 
     # current version of your application, you should pass the real 
     # application path instead of the path to the symlink to PHP 
     # FPM. 
     # Otherwise, PHP's OPcache may not properly detect changes to 
     # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 
     # for more information). 
     fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 
     fastcgi_param DOCUMENT_ROOT $realpath_root; 
     # Prevents URIs that include the front controller. This will 404: 
     # http://domain.tld/app.php/some-path 
     # Remove the internal directive to allow URIs like this 
     internal; 
    } 

    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { 
     access_log  off; 
     log_not_found  off; 
     expires   30d; 
    } 

    # return 404 for all other php files not matching the front controller 
    # this prevents access to other php files you don't want to be accessible. 
    location ~ \.php$ { 
     return 404; 
    } 

    error_log /var/log/nginx/project_error.log; 
    access_log /var/log/nginx/project_access.log; 
} 

答えて

1

リクエストは、次の場所にマッチ:

location ~ \.php$ { 
    return 404; 
} 

私は/app_dev.php/assets/js/wiget_load.jsを訪問する場合、これはまた、正常に動作します。 PROD

はい、上のDEV用のPHPが、このURIはlocation ~ ^/(app_dev|config)\.php(/|$)location ~ \.php$にマッチした、と使用nginxのは、最初のそれは私のwrited(どのように見られないので、 n設定ファイル)。だから、

、今私の提案は、すべての.phpファイルは/app.php、決してするルートがディスク上に存在していても、クライアントにtranseredます

location ~ \.php$ { 
    try_files /never_exists_filename /app.php$is_args$args; 
} 

がどのように修正します...。 try_files $uri /app.php$is_args$args;ここでは安全ではありません。ディスク上に.phpファイルが存在すると、静的ファイルとしてブラウザに渡されます。

+0

"とnginxが最初に見つかった" --- nginxは実際にはそれがより長いため一致しました。 – zerkms

+1

いいえ、最も長い一致するプレフィックスルールは、通常の場所でのみ使用されます。 RegExpの場所は最初から最後まで順にテストされ、最初の試合の後に停止します。 –

+0

ああ、面白いです、私はそれが常に重要な長さだと思った。ありがとう! – zerkms

関連する問題