7

Nginx をセットアップしたばかりで、それを使用して Laravel アプリをホストしようとしていますが、2 つの問題が発生しました。

  1. GET メソッドの場合、入力で常に追加のパラメーターを取得します。
    • PostMan (Chrome) を使用してテストを行い、宛先 URL と目的のパラメーターを設定して、要求を送信しました。私が得た出力には、すべきではないものが常に含まれてREQUEST_URIいます。出力例:

.

Array (
  [/api/user] => // This shouldn't be here
  [test] => test
)
  1. 私のパラメーター (上記) は、 DELETEまたは PUT に対してはまったく表示されず、POST に対しては、REQUEST_URI

Nginx vhost ( Nginx を使用した Laravel のセットアップに続きます)

server {
    server_name local.test.com;
    root /var/www/test/public;

    location / {
        index index.php index.html index.htm;
    }

    # serve static files directly
    location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
        access_log off;
        expires max;
    }

    # removes trailing slashes (prevents SEO duplicate content issues)
    if (!-d $request_filename) {
        rewrite ^/(.+)/$ /$1 permanent;
    }

    # unless the request is for a valid file (image, js, css, etc.), send to bootstrap
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }

    # catch all
    error_page 404 /index.php;

    # The PHP Inclusion Block
    # include /etc/nginx/includes/php;
    location ~ \..*/.*\.php$ {
        # I'm pretty sure this stops people trying to traverse your site to get to other PHP files
        return 403;
    }

    #location ~ \.php$ {
    location ~ \.php(.*)$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include /etc/nginx/fastcgi_params;
    }

# Deny Any Access to .htaccess Files That May Be Present (not usually in issue in Laravel)
# include /etc/nginx/includes/deny_htaccess;
location ~ /\.ht
{
    deny all;
}

    error_log  /var/www/logs/test-error.log;
}

fastcgi_params :

fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;

fastcgi_param   SCRIPT_FILENAME         $request_filename;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;

#fastcgi_param  HTTPS                   $https;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

fastcgi_connect_timeout                 60;
fastcgi_send_timeout                    180;
fastcgi_read_timeout                    180;
fastcgi_buffer_size                     128k;
fastcgi_buffers 4                       256k;
fastcgi_busy_buffers_size               256k;
fastcgi_temp_file_write_size            256k;
fastcgi_intercept_errors                on;

nginx.conf変更されたのは 1 つだけで、それはkeepalive_timeout65 から 15です

ですから、このすべてがどこでうまくいかないのか、私にはまったくわかりません。しかし、私が持っている別の 2 つの環境 (1 つは Lighttpd を使用し、もう 1 つは Apache2 を使用) では、アプリが完全に動作することを言及する必要があります。

私が気づいたことから、すべてが次のコードに縮小されました。

# unless the request is for a valid file (image, js, css, etc.), send to bootstrap
if (!-e $request_filename) {
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

これにより、GETが機能します...そして追加のパラメーターを追加します

4

5 に答える 5

5

nginx構成で不必要な書き換えを避けるのが最善です(Nginxの落とし穴を参照)。特に、Laravelフロントコントローラーにリクエストを渡す責任があります。

Laravelに必要なのは次のとおりです。

location / {
    index index.php index.html index.htm;
    try_files $uri $uri/ index.php?$query_string;
}

最初にファイルに直接アクセスしようとし、次にディレクトリにアクセスしようとします。どちらも存在しない場合は、リクエストをindex.phpに渡します。そうしないと失われるデータ$query_stringが含まれるため、渡すことが重要です。$_GET

そして、これが私自身のFastCGI構成ピースです。

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME    $document_root/$fastcgi_script_name;
    include        fastcgi_params;
}

予想外の入力に関しては、それはあなたの現在の書き換えが機能する方法かもしれませんが、確かに、あなたは何を出力していますか?

于 2013-02-13T13:15:46.263 に答える
2

これは私のために働く:

location / {
    index   index.php;
    try_files $uri $uri/ /index.php?q=$uri&$args;
}

location ~ \.php$ {

    include     fastcgi_params;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;

    fastcgi_split_path_info                 ^(.+\.php)(/.+)$;
    fastcgi_param PATH_INFO                 $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED           $document_root$fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME           $document_root$fastcgi_script_name;

}
于 2013-02-24T09:39:00.880 に答える
1

設定から:

rewrite ^/(.*)$ /index.php?/$1 last;

ここにリダイレクトがあります/index.php?/$1(例/index.php?/some/path)。

fastcgi_split_path_info ^(.+\.php)(/.+)$;

^(.+\.php)(/.+)$ここで、正規表現によってパスをこぼしました(例/index.php/some/path)。

違いに気づきましたか?

于 2013-02-18T17:13:20.373 に答える