Я пытаюсь настроить nginx так, чтобы он загружал файлы PHP без расширения, но по-прежнему передавал запросы на недостающие файлы на фронт-контроллер.
Я начал с в основном работающей конфигурацией, подобной следующей, которая правильно загружает URL-адреса типа "about.php" из webroot / about.php и правильно отправляет все запросы на отсутствующие файлы в webroot / index.php:
server {
listen 80;
listen 443 ssl http2;
server_name *.example.com;
root /srv/example/$host;
client_max_body_size 8M;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
large_client_header_buffers 8 32k;
ssl_certificate /etc/ssl/certs/example+ca.pem;
ssl_certificate_key /etc/ssl/private/example.key;
ssl_ciphers '...';
location / {
try_files $uri
/index.php$is_args$args;
}
location /blog {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:2368;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php\b)(.*)$;
fastcgi_param SERVER_NAME $host;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_index index.php;
include fastcgi.conf;
fcgi_pass php-fpm;
}
}
Я пытаюсь добавить . php
arg в файлы try_files, как показано ниже, чтобы я мог загружать URL-адреса типа / about из webroot / about.php:
location / {
try_files $uri
$uri.php
/index.php$is_args$args;
}
Теперь /about.php загружается, как ожидалось, но / about загружает файл. Я не могу понять, как принудительно выполнить внутреннее перенаправление при сохранении универсальности для фронт-контроллера. Я видел, как несколько человек предлагали удалить = 404, но проблема здесь не в этом.
журнал ошибок (/ about): https://pastebin.com/XbdjLri4
173.196.243.178 - - [16/May/2017:21:35:03 +0000] "GET /about HTTP/1.1" 200 6176 "-" "Wget/1.18 (linux-gnu)"
журнал ошибок (/about.php ): https://pastebin.com/ay32GZ0m
173.196.243.178 - - [16/May/2017:21:35:10 +0000] "GET /about.php HTTP/1.1" 200 25848 "-" "Wget/1.18 (linux-gnu)"
Проблема в том, что значение URI запроса, которое nginx видит здесь после try_files
, по-прежнему равно примерно
. Поскольку для этого нет другого местоположения
, он просто отправляет файл в браузер.
Я думаю, что этот подход будет работать:
location / {
if (!-e $uri) {
rewrite (.+)(?!\.php)$ $1.php last;
}
try_files $uri /index.php$is_args$args;
}
location ~ [^/]\.php(/|$) {
...
fcgi_pass php-fpm;
}
Здесь мы отдельно проверяем, существует ли запрошенный файл на сервере. Если это не так, мы переписываем URL, если он не имеет расширения .php
, и добавляем к нему расширение PHP.
Затем мы выполняем try_files
.