В каждом руководстве по настройке 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. Только самые простые программы должны делать это. Остановитесь сейчас и измените свое приложение, пока вы все еще можете сделать это легко.