Рейтинг:1

NGINX получает приложение в подпапке для работы с редиректами

флаг cn

я установил Маутик в подпапке типа: пример.com/м
Большая часть Mautic работает нормально с моей конфигурацией (панель администратора, использование Mautic и т. д.), но для некоторых перенаправлений в моей подпапке я получаю 404:

пример.com/m 200
example.com/m/form/9 200
example.com/m/form/generate.js?id=9 404

(/form не существует - он должен быть перенаправлен/сгенерирован Mautic динамически)

Все файлы в файловой системе принадлежат www-data.

Моя конфигурация nginx для хоста:

сервер {
    имя_сервера www.example.com;
    перезаписать_журнал;

    корень /var/www/example.com/www.example.com;
    индекс index.php index.html index.htm;

    журнал_доступа /var/log/nginx/example.com_access.log;
    error_log /var/log/nginx/example.com_error.log уведомление;

    ########################################
    ## Запуск конкретной конфигурации Mautic #####
    ########################################

    местоположение / м {
        # Работаем несмотря на формы:
        try_files $uri $uri/ /m/?q=$uri&$args;
    }

    ########################################
    ## Конец конкретной конфигурации Mautic #####
    ########################################

    место расположения / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    расположение ~ \.php$ {
        включить фрагменты/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }

    # Длительное время жизни кеша браузера может ускорить повторные посещения вашей страницы
    расположение ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
       доступ_лог выключен;
       log_not_found выключен;
       истекает 360 дней;
    }

    # отключаем доступ к скрытым файлам
    местоположение ~ /\.ht {
      доступ_лог выключен;
      log_not_found выключен;
      отрицать все;
    }

    слушать [::]:443 ssl; # под управлением Certbot
    слушать 443 ssl; # под управлением Certbot
    ssl_certificate /etc/letsencrypt/live/stats.example.com/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/stats.example.com/privkey.pem; # под управлением Certbot
    включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot
}

сервер {
    слушать 443 ssl;
    имя_сервера пример.com;
    слушать [::]:443 ssl; # под управлением Certbot
    ssl_certificate /etc/letsencrypt/live/stats.example.com/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/stats.example.com/privkey.pem; # под управлением Certbot
    включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot
    вернуть 301 https://www.example.com$request_uri;

}

сервер {
    если ($host = example.com) {
        вернуть 301 https://$host$request_uri;
    } # управляется Certbot


    если ($host = www.example.com) {
        вернуть 301 https://$host$request_uri;
    } # управляется Certbot


    имя_сервера example.com www.example.com;
    слушать 80;
    слушать [::]:80;
    вернуть 301 https://$host$request_uri;
    #возврат 404; # под управлением Certbot

}

Что я делаю не так?

Richard Smith avatar
флаг jp
Ваш блок `location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$` обрабатывает URI, оканчивающийся на `.js`. Вы можете попробовать переместить этот блок внутрь блока `location/`.
флаг cn
Это действительно правильно. Теперь это работает. Если вы добавите это как ответ, я приму это :)
Рейтинг:1
флаг jp

Вам нужны URI, которые начинаются с быть обработанным место/м блокировать.

Однако расположение регулярных выражений имеет приоритет, поэтому URI /м/форма/генерировать.js на самом деле обрабатывается другим местоположением, которое соответствует всем URI, которые заканчиваются на .js. Видеть этот документ.

Здесь ^~ оператор, который заставляет местоположение префикса иметь приоритет, но это не будет работать в вашем случае, так как приложение представляет собой PHP, и вам нужны URI, которые заканчиваются на .php быть обработанным расположение ~ \.php$ блокировать.

Поэтому вместо этого я предлагаю вам вложить место расположения вызывает проблему внутри место расположения / блокировать.

Например:

местоположение / м {
    try_files $uri $uri/ /m/?q=$uri&$args;
}

место расположения / {
    try_files $uri $uri/ /index.php$is_args$args;

    расположение ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
        доступ_лог выключен;
        log_not_found выключен;
        истекает 360 дней;
    }
}

расположение ~ \.php$ {
    ...
}

местоположение ~ /\.ht {
    ...
}
флаг cn
Спасибо, очень понятно!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.