2013-02-13 14 views
6

Po prostu skonfigurowałem Nginx i próbuję go użyć do hostowania aplikacji Laravel, ale napotkałem 2 problemy.Laravel z parametrami Nginx są puste

  1. Dla metody GET zawsze otrzymuję dodatkowy parametr w moich danych wejściowych.
    • Za pomocą PostMana (Chrome) wykonuję moje testy, ustawiam docelowy adres URL i moje pożądane parametry i wysyłam żądanie. Wynik, który otrzymuję, zawsze zawiera wartość REQUEST_URI, której nie powinien. Przykładowy wynik:

.

Array (
    [/api/user] => // This shouldn't be here 
    [test] => test 
) 
  1. Moje parametry (powyżej) nieshow dla DELETE lub PUT w ogóle, a dla POST Wezmę tylko REQUEST_URI

Nginx vhost (Z Setting up Laravel w/ Nginx)

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 Ma tylko 1 rzeczy zmieniły się, a to jest keepalive_timeout od 65 do 15

Więc absolutnie nie mają pojęcia, gdzie to wszystko, co idzie źle. Ale muszę wspomnieć, że w dwóch innych środowiskach, które mam (jeden z Lighttpd i drugi z Apache2) aplikacja działa idealnie.

Z tego co zauważyłem, jego wszystko sprowadza się do następującego kodu:

# 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; 
} 

co uczyni pracę GET ... i dodać dodatkowy parametr

Odpowiedz

5

to najlepiej, aby uniknąć zbędnych przepisuje w konfiguracji nginx (Zobacz Nginx Pitfalls), jeden w szczególności jest odpowiedzialny za przekazanie wniosku do regulatora przedniego laravel:

Wszystko, czego potrzebujesz do laravel jest:

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

Najpierw próbuje uzyskać bezpośredni dostęp do pliku, a następnie do katalogu, a jeśli nie istnieje, przekazuje żądanie do index.php. $query_string jest ważny, ponieważ zawiera dane, które w innym przypadku zostaną utracone.

I tu jest mój własny kawałek konfiguracji 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; 
} 

Jak dla niespodziewanego wejścia, może to być sposób bieżące prace przepisywania, ale na pewno powiedzieć, co ty na wyjściu?

+0

'dd (wejście :: wszystkie());' to co ja” m outputting ... i nie, to nie jest 'Input :: all()', które ustawiają niepożądany parametr – Alex

+0

W porządku. Wypróbuj sugerowaną konfigurację i powiedz mi, czy to działa. – Gargron

+0

Po prostu wypróbowałem to, komentując 'if's zawierający regułę przepisywania, a teraz nie otrzymuję żadnych wyników moich parametrów. – Alex

1

ze swojego config:

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

tutaj masz przekierowanie do /index.php?/$1 (np /index.php?/some/path).

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

a tu rozlane ścieżkę ^(.+\.php)(/.+)$ regex (np /index.php/some/path).

Czy zauważyłeś różnicę?

+0

Naprawdę usunąłem część 'fastcgi_spli' i teraz dostaję parametry, ale nadal mam' [/ api/user] =>// To nie powinno być tutaj problemu " – Alex

+0

Poszłam za http://stackoverflow.com/questions/8856664/setting-up-laravel-w-nginx i po prostu trochę się zepsuła – Alex

+0

Ale skonfigurowałeś Nginx w ten sposób. Twój 'przepisać ^/(. *) $/Index.php?/$1 ostatni;' jest odpowiedzialny za dodanie ścieżki do parametrów. – VBart

1

Działa to dla mnie:

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; 

} 
+0

Nie sądzę, że Laravel spodziewa się parametru 'q', nie widziałem go wcześniej. Ale zobaczyłem to w CI – Alex

+0

Tak, przetestowałem to bez 'q' i działa dobrze. Więc try_files $ uri $ uri// index.php? $ Args; 'działa. –

0

Jest to konfiguracja, która działa na mnie z Nginx i laravel

server { 

    listen 80; 
    server_name sub.domain.com; 
    set $root_path '/var/www/html/application_name/public'; 
    root $root_path; 

    index index.php index.html index.htm; 

    try_files $uri $uri/ @rewrite; 

    location @rewrite { 
     rewrite ^/(.*)$ /index.php?_url=/$1; 
    } 

    location ~ \.php { 

     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index /index.php; 

     include /etc/nginx/fastcgi_params; 

     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; 
    } 

    location ~* ^/(css|img|js|flv|swf|download)/(.+)$ { 
     root $root_path; 
    } 

    location ~ /\.ht { 
     deny all; 
    } 

}