nginx как перенаправить в папку wordpress, если URL-адрес содержит определенное слово

Прежде всего, корень моего домена настроен для обслуживания веб-страницы Angular с использованием обратного прокси-сервера, который перенаправляет на локальный ip / порт, который работает как шарм. Проблема возникает сейчас, когда я хочу переопределить корневое правило, если URL-адрес содержит /blog, который я хочу перенаправить в папку wordpress. На данный момент и с этой конфигурацией я могу связаться с wordpress, но только с определенными URL-адресами, такими как example.com/blog/wp-admin/index.php, но если я получаю доступ к example.com/blog, он все равно перейдет в приложение angular. Я настроил свой nginx следующим образом (я должен сказать, что настраиваю веб-сервер впервые):

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    server_name example.com www.example.com;

    client_max_body_size 100M;
    root /var/www;
    index index.php index.html index.htm index.nginx-debian.html;
    autoindex off;

    location ~ /blog(.*)+/(.*)$ {
        try_files $uri $uri/ /blog/index.php?$args /blog/index.php?q=$uri&$args;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
   }

    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true; proxy_redirect off;
        http2_push /var/www/example_frontend/dist/example-frontend/favicon.ico;
        http2_push /var/www/example_frontend/dist/example-frontend/manifest.json;
    }

    location /robots.txt {
        alias /var/www/example_frontend/robots.txt;
    }

    location /sitemap.xml {
        alias /var/www/example_frontend/sitemap.xml;
    }

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
}


server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name example.com www.example.com;
    return 404; # managed by Certbot
}

Он отлично работает, если я остановлю свое приложение angular, поэтому я думаю, что мне нужно сначала активировать местоположение / blog, но я пробовал во всех возможных формах, но безрезультатно. Кто-то видит, что не так? Я думал, что первое правило срабатывает первым, но, похоже, нет.

Заранее спасибо.

При необходимости я могу добавить любой другой файл конфигурации;)


person Jordi    schedule 28.02.2019    source источник


Ответы (1)


URI /blog не соответствует регулярному выражению вашего location, для сопоставления которого требуется дополнительный / где-нибудь в URI.

Упрощенное решение:

location /blog {
    try_files $uri $uri/ /blog/index.php?q=$uri&$args;
    ...
}

Вышеупомянутое будет соответствовать /blog и /blog/, но также соответствует /blogx (что может быть нежелательно).


Вы можете использовать измененное регулярное выражение, например:

location ~ ^/blog(/|$) {
    try_files $uri $uri/ /blog/index.php?q=$uri&$args;
    ...
}

Наиболее эффективное решение - использовать расположение префиксов, но с дополнительным вводом:

location /blog {
    return 301 /blog/;
}
location /blog/ {
    try_files $uri $uri/ /blog/index.php?q=$uri&$args;
    ...
}

Дополнительную информацию см. В этом документе. Между прочим, ваш try_files оператор содержит ложный параметр.

person Richard Smith    schedule 28.02.2019
comment
Спасибо за ответ Ричард, я обновил конфигурацию с вашими предложениями и все еще веду себя так же. Это заставляет меня думать, что проблема, вероятно, в угловой маршрутизации ... но я должен сказать, что я удалил для нее резервное правило. Не уверен, что ищу ошибку в правильном контексте ... - person Jordi; 28.02.2019
comment
Также убедитесь, что вы очистили кеш браузера и перезапустили Nginx после любых изменений. - person Richard Smith; 28.02.2019
comment
Да, я это сделал. Теперь я протестировал curl curl https://example.com/blog/ и получаю правильный html-контент wordpress, в то время как Chrome перенаправляет на приложение Angular. - person Jordi; 28.02.2019
comment
Нет, я получаю 301 Moved Permanently (я использовал ваш второй фрагмент кода, а не третий, если это полезно знать) - person Jordi; 28.02.2019
comment
Это нормально, поэтому мне кажется, что Chrome по какой-то причине все еще полагается на свой кеш. Проверьте журналы доступа - посмотрите, что Chrome запрашивает с вашего сервера. - person Richard Smith; 28.02.2019
comment
Позвольте нам продолжить это обсуждение в чате. - person Jordi; 28.02.2019
comment
Наконец решено, это было связано с сервисным воркером Angular. Я не знаю, как я достиг этого данного он находится в React, но в моем Angular поведение было точно таким же. В любом случае спасибо за проверку моего файла конфигурации nginx! - person Jordi; 28.02.2019