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

Конфигурация Nginx в стеке LEMP: действительно ли необходимы файлы try_files?

В каждом руководстве по настройке Nginx стека LEMP, которое я читал в Интернете, говорится, что вам нужно добавить этот код в директиву try_files.

try_files $uri $uri/ /index.php$is_args$args;

Но проблема с этим кодом в том, что моя пользовательская страница 404 больше не будет отображаться. Очевидно, проблема в том, что try_files возвращается к index.php, но мне не нравится, как example.com/nothing/to/see/here перенаправляется на домашнюю страницу.

Если я изменю директиву try_files на ...

try_files $uri $uri/ =404;

... он работает отлично, как и ожидалось. Мои скрипты PHP все еще работают, потому что у меня тоже есть это в моей конфигурации:

location ~* \.php$ {
  fastcgi_pass unix:/run/php/php7.2-fpm.sock;
  include         fastcgi_params;
  fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
  fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
}

У меня вопрос: почему все онлайн-руководства настаивают на следующем:

try_files $uri $uri/ /index.php$is_args$args;        ????

Я даже закомментировал файлы try_files, и мой сайт по-прежнему ведет себя правильно

#try_files $uri $uri/ /index.php$is_args$args;

Требуется ли try_files, учитывая, что он работает должным образом с закомментированным кодом?

Я пытаюсь организовать свои файлы nginx.conf и site.conf, чтобы у меня был мастер, с которым можно было бы работать, когда я устанавливаю новые серверы.

Полный nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}

http {
    # Basic Settings
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_intercept_errors on;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # SSL Settings
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
     # Logging Settings
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    #Gzip Compression
    gzip on;
    gzip_buffers 16 8k;
    gzip_comp_level 6;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_vary on;
    gzip_types
      text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
      text/javascript application/javascript application/x-javascript
      text/x-json application/json application/x-web-app-manifest+json
      text/css text/plain text/x-component
      font/opentype application/x-font-ttf application/vnd.ms-fontobject
      image/x-icon;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

И мой полный site.conf

server {
    listen         80;
    server_name    example.com www.example.com;
    return 301     https://example.com$request_uri;
}

server {
    listen         443;
    server_name    www.example.com;
    ssl            on;
    ssl_certificate_key /etc/sslmate/example.com.key;
    ssl_certificate /etc/sslmate/example.com.chained.crt;
    return 301     https://example.com$request_uri;
}

server {
    listen         443;
    server_name    example.com;
    root           /home/garrett/domains/example.com/public_html;
    access_log     /home/garrett/domains/example.com/logs/access.log;
    error_log      /home/garrett/domains/example.com/logs/error.log;
    index          index.php index.html index;
    error_page     404 /404.php;

    ssl on;
    ssl_certificate_key /etc/sslmate/example.com.key;
    ssl_certificate /etc/sslmate/example.com.chained.crt;

    # Recommended security settings from https://wiki.mozilla.org/Securit/Server_Side_TLS
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES1$
    ssl_prefer_server_ciphers on;
    ssl_dhparam /usr/share/sslmate/dhparams/dh2048-group14.pem;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:5m;

    # Enable this if you want HSTS (recommended)
    add_header Strict-Transport-Security max-age=15768000;

location / {
     #try_files $uri $uri/ /index.php$is_args$args;
     try_files $uri $uri/ =404;
}
location ~* \.php$ {
     fastcgi_pass unix:/run/php/php7.2-fpm.sock;
     include         fastcgi_params;
     fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
     fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
}

location = /favicon.ico {
     log_not_found off;
     access_log off;
}

location = /robots.txt {
     allow all;
     log_not_found off;
     access_log off;
}

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
     expires max;
     log_not_found off;
}

}

Этот конкретный призыв к try_files (и аналогичные) поддерживает шаблон переднего контроллера, в котором один файл PHP вызывается независимо от URL-адреса, а создаваемые вами URL-пути могут быть произвольными (и удобными для поисковых систем).

Похоже, вы не используете этот шаблон, а просто создаете отдельные файлы PHP для каждого URL. Только самые простые программы должны делать это. Остановитесь сейчас и измените свое приложение, пока вы все еще можете сделать это легко.