nginx try_files не выполняет внутреннее перенаправление

Я пытаюсь настроить 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)"
0
задан 17 May 2017 в 00:37
1 ответ

Проблема в том, что значение 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 .

1
ответ дан 4 December 2019 в 16:15

Теги

Похожие вопросы