2016-04-22 47 views
19
dinamik

önce statik sayfa hizmet etmek, ancak dosya eksikse, o bir PHP dosyası yerine yükleyeceğini ve PHP içeriği ele olmalıdır.Nginx ben nginx ile statik HTML dosyaları hizmet etmek istiyorum

try_files'un çeşitli kombinasyonlarını test ediyorum, ancak kafamı alamıyorum. olmalıdır her sayfaya tarama

<?php 

$path = $_SERVER['REQUEST_URI']; 
$pattern = '/^\/(.*)\.html$/'; 

$matches = []; 

$results = preg_match($pattern, $path, $matches); 

if (count($matches) > 0) { 
    if ($matches[1] == "dynamic") { 
     require 'dynamic.php'; 
    } else { 
     echo "Not found!"; 
    } 
} else { 
    echo "Index page!"; 
} 

sonuçları:

./ 
../ 
dynamic.php 
index.php 
static/ 
static/static.html 

Sonra böyle endeksi küçük bir PHP kodu var: Ben şöyle bir kukla PHP uygulaması var

server { 
    listen 80; 
    server_name .foo.bar *.foo.bar; 

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

    root /var/www/foo; 
    index index.php; 

    location/{ 
     # Trying with 'try_files' here. No success. 
    } 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
} 
0123:

Bu

http://foo.bar/    - Loads index.php 
http://foo.bar/static.html - Loads static/static.html 
http://foo.bar/dynamic.html - Loads index.php & PHP requires dynamic.php 
http://foo.bar/baz.html  - Loads index.php with "not found" message 
Ben nginx yapılandırma dosyasında ne var

Ben defalarca çalışıyor ve besbelli tamamen bu hat ile başarısız oldum:

try_files $uri $uri/static /index.php; 

ben eksik bir şey. Yardım et?

+0

senin durumunda yeniden yazma bazı URL yapmak ama PHP sürekli kullanılarak görüntülenir sayfasını işlemek mümkün değil midir? – AntoineB

cevap

5

Ben belge kökü olarak statik dizini kullanır. Bu, kimsenin doğrudan /dynamic.php yürütebileceği sağlar, ancak adlandırılmış konum bloğu @php tarafından sizin index.php iletilir.

Bu yapılandırma örneği test edilmedi! Bu varsayılan olduğundan sadece 80 içeriyorsa

server { 
    index  index.php; 
    root  /var/www/foo/static; 
    server_name foo.bar *.foo.bar; 

    location/{ 
     try_files $uri @php; 
    } 

    location @php { 
     include fastcgi_params; 

     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /var/www/foo/index.php; 
    } 
} 
  1. Sen listen direktifini gerekmez.
  2. server_name s lider nokta içermemelidir.
  3. $uri daima try_files (örn /var/www/foo/static.html) çağrılması sırasında belge köküne onları önek lider çizgi (örn /static.html) ve nginx dahil olmak üzere istenen URI içeriyor.Bu nedenle, $uri önce static dizininizi ayarlamanız gerekir (ör. /static$uri, /var/www/foo/static/static.html olur).
  4. fastcgi_split_path_info'a ihtiyacınız yoktur, çünkü bu özelliği kullanmıyorsunuz.
  5. PHP konumunuzda bulunan try_files nginx'in işleri düzgün bir şekilde iletmesini imkansız kılar. /dynamic.html için bir istek .php'da bitmez, dolayısıyla try_files her zaman başarısız olur.
+0

Her iki .example.com veya "example.com * .example.com"; Her ikisinin kombinasyonu kullanımı mantıklı değil. – Fleshgrinder

+0

Aslında orada '' php'' yerine 'try_files' eklenemiyor çünkü' dynamic.html' dosyası yok ve nginx isteği php-fpm'ye iletmeyecekti. Ancak, bahsettiğiniz sorunu hesaba katmak için yapılandırmayı değiştirdim. – Fleshgrinder

+0

Üzgünüz, 2. noktanızı yanlış anladım. Birinin hiçbir zaman bir lider ismi olan bir sunucu adı kullanmaması gerektiğini söylüyordum. Analizinize tamamen katılıyorum –

6

URL'den static dizini gizleme birkaç yolu vardır. Örneğin, root, try_files veya rewrite akıllı kullanımının işlenmesi.

root /var/www/foo; 

location/{ 
    root /var/www/foo/static; 
    try_files $uri /index.php; 
} 

location ~ \.php$ { ... } 

böylece nginx Normal dosyalar için static klasöründe görünüyor, ama .php dosyalar için üst klasör:

Muhtemelen en belirgin budur.

root /var/www/foo; 

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

location ~ \.php$ { ... } 

varlığı için test etmeden önce herhangi URI /static öneki:

Ne elde çalışıyorlardı böyle bir şey oldu. /index.php, farklı bir yerde işlenmesi gereken son öğe olmalıdır. Daha fazla bilgi için this document'a bakın.

+0

Yaptığım hatayı işaretlediğiniz için teşekkürler, ama öneriniz de çalışmıyor. '/' Adresine gitmeye çalışırken, '// static /' (iki ileri eğik çizgi ile) yönlendirildim ve '/ static.html 'ye gitmeye çalışırken'/static /' dizinine yönlendirildim. =/ – Apollo

+0

@Apollo Hata modunu yeniden oluşturamıyorum ama ilk örneğe bir 'try_files' ifadesi eklemem gerekiyor. –

+0

@Apollo, bu cevabın iki örneğinden hangisinde yorumunuzda açıklanan hatayı almak için kullandınız? – russell

1

Verdiğiniz belirli örnek duruma bağlı olarak, aşağıdaki yapılandırma listelediğiniz sonuçları döndürecektir. olduğu

server { 
    listen 80; 
    server_name .foo.bar *.foo.bar; 

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

    root /var/www/foo; 
    index index.php; 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php5-fpm-foo.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 

    location ~ /static { 
     rewrite ^/static\.html$ /static/ last; 
     index static.html; 
    } 
    location ~/{ 
     rewrite^/index.php last; 
    } 

...

http://foo.bar/    - Loads index.php 
http://foo.bar/static.html - Loads static/static.html 
http://foo.bar/dynamic.html - Loads index.php & PHP requires dynamic.php 
http://foo.bar/baz.html  - Loads index.php with "not found" message