Назад | Перейти на главную страницу

Nginx обслуживает простой файл, если существует, еще служит /index.php

Я хочу, чтобы Nginx обслуживал любые запросы статических файлов самостоятельно, но если файл не существует, то обслуживайте index.php, который все это обработает.

В настоящее время моя конфигурация выглядит так,

server {
listen 80;
listen [::]:80;

root /home/www/example.com/htdocs;

index index.php;

server_name www.example.com;


location ~* ^[^\?\&]+\.(html|jpg|jpeg|json|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|svg|woff|ttf)$ {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.php
    try_files $uri $uri/ /index.php;
    #try_files /favicon.ico =404;
}


location / {
    add_header X-Is-PHP true;
            try_files /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
    }


}

Это настолько близко, насколько я могу, он обслуживает любой запрос статических файлов, а если он не существует, то использует index.php как текстовый файл. Как я могу передать index.php интерпретатору PHP?

попробуй это

server {
listen 80;
listen [::]:80;

root /home/www/example.com/htdocs;

index index.php;

server_name www.example.com;


location ~* ^[^\?\&]+\.(html|jpg|jpeg|json|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|svg|woff|ttf)$ {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.php
    try_files $uri $uri/ /index.php;
    #try_files /favicon.ico =404;
}

error_page 404 /index.php;

location ~ \.php$ {
            add_header X-Is-PHP true;
            #try_files $uri =404;
            try_files /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
    }


}

изменения

1) Добавлена ​​error_page 404 /index.php; так что все запросы, не найденные на сервере, перенаправляются на index.php

2) Добавлен "~ .php $" в атрибут местоположения.

3) Если вы хотите, чтобы другие файлы PHP также интерпретировались, раскомментируйте строку "#try_files $ uri = 404;" и прокомментируйте строку "try_files /index.php = 404;"

location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php; } }

Если честно, вам НЕ стоит использовать If. Об этом даже упоминается в руководстве NGINX на их веб-сайте. Отличный способ добиться обслуживания файла, если он существует, - это правильно использовать try_files. Вот пример, который я привел ниже.

set $base_root /webhosts/website.com/webroot;
root $base_root;

#if file exists then serve it. Else Fallback to @php location directive
location / {
    try_files $uri $uri/ @php;
}

location @php { 
    rewrite ^/(.+)$ /index.php?/$1 last;
}

В приведенном выше примере просто используется нужное мне правило перезаписи. Вы должны использовать try_files и позволить третьему аргументу (директиве Fallback) определять, что произойдет дальше.

Также убедитесь, что вы установили корень. Если вы установите root в /, это очень опасно, потому что вы открываете системный корень для файлов, которые вам не должны делать.