Я получаю нежелательное поведение от Nginx, где он перенаправляет запросы, когда я пытаюсь получить доступ к индексным файлам в подкаталогах моего веб-приложения с тем же URL-адресом, но с добавленной косой чертой.
У меня есть простое веб-приложение, настроенное с корневым каталогом, и несколько подкаталогов внутри него, каждый из которых содержит файл index.php. ОС сервера – это сервер Ubuntu, Nginx – сервер, а PHP5-fpm – установлен.
Я хочу перейти к http://foo/bar
чтобы получить вывод index.php внутри bar
. Но если я перейду к http://foo/bar
я всегда перенаправляюсь на http://foo/bar/
.
Я просмотрел журнал доступа Nginx в /var/log/nginx/access.log
и кажется, что запросы перенаправляются из того, что я запрашиваю (например, http://XXX.XXX.XX/about
) к тому же URL с добавленной косой чертой ( http://XXX.XXX.XX/about/
) через 301. Вот пример кода из журнала:
192.168.1.2 - - [06/May/2015:14:53:20 -0500] "GET /why HTTP/1.1" 301 178 "http://192.168.1.7/services/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:37.0) Gecko/20100101 Firefox/37.0" 192.168.1.2 - - [06/May/2015:14:53:20 -0500] "GET /why/ HTTP/1.1" 200 3086 "http://192.168.1.7/services/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:37.0) Gecko/20100101 Firefox/37.0" 192.168.1.2 - - [06/May/2015:14:53:20 -0500] "GET /contact HTTP/1.1" 301 178 "http://192.168.1.7/why/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:37.0) Gecko/20100101 Firefox/37.0" 192.168.1.2 - - [06/May/2015:14:53:20 -0500] "GET /contact/ HTTP/1.1" 200 2325 "http://192.168.1.7/why/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:37.0) Gecko/20100101 Firefox/37.0"
Но я не уверен, почему они перенаправляются или что вызывает это.
Это файлы конфигурации Nginx:
user nginx; worker_processes 1; pid /run/nginx.pid; events { worker_connections 1024; # multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; include /etc/nginx/sites-enabled/*; }
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/; index index.php index.html index.htm; server_name localhost; location / { try_files $uri $uri/ =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/html/; } location ^~ /files/ { root /var/www/html/; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
Почему Nginx делает это и что является (-ым) решением (-ами) для этого? Что является самым «чистым», «правильным» или самым верным для конвенции?
Это результат директивы try_files
. Он ищет файл с именем, и когда он не находит его, он продолжает искать папку с именем. (Папка указана в трейлинге /
на $uri/
.)
Папка about/
matching, поэтому nginx будет искать файл, соответствующий любому из имен, указанных в директиве index
. Однако использование индексного файла приводит к внутреннему переадресации (цитируется в документах nginx) , в котором находится ваш трейлинг.
Для чего это стоит, я вижу то же самое поведение в моей установке nginx, так что это не (просто) ваш конфиг.