nginx как перенаправить в папку WordPress, если URL содержит конкретное слово - PullRequest
0 голосов
/ 28 февраля 2019

Прежде всего мой домен root настроен для обслуживания веб-страницы Angular с использованием обратного прокси-сервера, который перенаправляет на локальный IP / порт, который работает как шарм.Проблема возникает сейчас, когда я хочу переопределить корневое правило, если URL содержит /blog, который я хочу перенаправить в папку WordPress.На данный момент и с этим конфигом я могу достичь WordPress, но только конкретные URL-адреса, такие как example.com/blog/wp-admin/index.php, но если я получу доступ к example.com/blog, все еще собирается угловое приложение.Я настроил свой 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
}

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

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

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

1 Ответ

0 голосов
/ 28 февраля 2019

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 содержал ложный параметр.

...