2016-04-22 9 views
19

Chcę podawać statyczne pliki HTML za pomocą NGINX, ale jeśli brakuje pliku, powinien on załadować plik PHP, a PHP powinien obsługiwać zawartość.Nginx do obsługi statycznej strony przed dynamicznym

Testowałem kilka kombinacji try_files, ale nie mogę się z tym pogodzić. Mam atrapę aplikacji PHP, który wygląda tak:

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

to mam mały kod PHP na indeksie takiego:

<?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!"; 
} 

Wyniki przeglądania na każdej stronie powinny być:

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 

to co mam w pliku konfiguracyjnym nginx:

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

Byłem wielokrotnie próbuje i widocznie zupełnie niepowodzeniem z tej linii:

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

ja czegoś brakuje. Wsparcie?

+0

nie jest to możliwe w przypadku zrobić jakiś URL przepisywanie ale obsługiwać wyświetlaną stronę za pomocą PHP przez cały czas? – AntoineB

Odpowiedz

5

Chciałbym użyć twojego katalogu statycznego jako katalogu głównego. Gwarantuje to, że nikt nie będzie mógł wykonać bezpośrednio kodu /dynamic.php, ale zostanie przekierowany do twojego index.php przez nazwany blok lokalizacji @php.

Ten przykład konfiguracji nie został przetestowany!

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. Nie trzeba dyrektywę listen jeśli zawiera tylko 80, ponieważ jest to ustawienie domyślne.
  2. S nie powinny zawierać kropki wiodącej.
  3. Urządzenie zawsze zawiera żądany identyfikator URI, w tym wiodący ukośnik (na przykład /static.html), a nginx przedrostuje je głównym katalogiem po wywołaniu try_files (np. /var/www/foo/static.html).Dlatego musisz ustawić swój katalog static, zanim $uri (np. /static$uri stanie się /var/www/foo/static/static.html).
  4. Nie potrzebujesz fastcgi_split_path_info, ponieważ nie używasz tej funkcji.
  5. Twoja lokalizacja w Twojej lokalizacji PHP uniemożliwia prawidłowego przesyłania dalej rzeczy przez nginx. Żądanie dotyczące /dynamic.html nie kończy się na .php, w związku z tym try_files zawsze kończy się niepowodzeniem.
+0

Albo '.example.com' lub' example.com * .example.com'; użycie kombinacji obu nie ma sensu. – Fleshgrinder

+0

W rzeczywistości nie można dodać 'try_files' wewnątrz lokalizacji' @ php', ponieważ nie istnieje tam plik 'dynamic.html', a nginx nie przesłałby żądania do php-fpm. Jednak zmieniłem konfigurację, aby uwzględnić wspomniany problem. – Fleshgrinder

+0

Niestety źle zrozumiałem twój punkt 2. Myślałem, że mówisz, że nigdy nie należy używać nazwy serwera z wiodącą kropką. Całkowicie zgadzam się z twoją analizą –

6

Istnieje kilka sposobów ukrywania katalogu static pod adresem URL. Na przykład manipulowanie root, sprytne użycie try_files lub rewrite.

Prawdopodobnie najbardziej oczywiste to:

root /var/www/foo; 

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

location ~ \.php$ { ... } 

tak że nginx wygląda w folderze static dla normalnych plików, ale folder nadrzędny dla .php plików.

Co pan chce osiągnąć było coś takiego:

root /var/www/foo; 

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

location ~ \.php$ { ... } 

które prefiks /static do dowolnego URI przed badaniem istnienia. /index.php musi być ostatnim elementem, ponieważ wymaga przetwarzania w innej lokalizacji. Aby uzyskać więcej informacji, patrz this document.

+0

Dzięki za wskazanie popełnionego błędu, ale Twoja sugestia również nie działa. Podczas próby przejścia do '/', jestem przekierowywany do '// static /' (z dwoma forward-slashami) i podczas próby przejścia do '/ static.html' jestem przekierowywany do'/static/'. =/ – Apollo

+0

@Apollo Nie mogę odtworzyć Twojego trybu awaryjnego, ale musiałem dodać instrukcję "try_files" do pierwszego przykładu. –

+0

@Apollo, który z dwóch przykładów w tej odpowiedzi użyłeś do uzyskania błędu opisanego w komentarzu? – russell

1

Na podstawie podanego przykładu przykładu, poniższa konfiguracja zwróci wyniki, które podałeś.

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

To ...

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 
Powiązane problemy