Я хочу, чтобы 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 в /, это очень опасно, потому что вы открываете системный корень для файлов, которые вам не должны делать.