Рейтинг:0

NGINX rewrite URL on wordpress but getting 404

флаг my

I have a WordPress website where my URLs are currently written as follows
http://example.com/for-sale/12345-aaa-123-street-bbb-city/

and I would like to still serve the same URL, but I want the URL to look like
http://example.com/city/street/

I have created a rewrite rule of rewrite for-sale/([0-9]+)-aaa-(.*)-bbb-(.*) /$3/$2/ permanent;

This does rewrite my URL but returns a 404 error. Here is what the rewrite log returns

2021/11/04 04:48:39 [notice] 23077#23077: *4643 rewritten redirect: "/Vernon//539-Apache-County-Road-3144/", client: 108.162.215.21, server: example.com, request: "GET /for-sale/20071-aaa-539-Apache-County-Road-3144-bbb-Vernon/ HTTP/1.1", host: "example.com", referrer: "https://example.com/vernon/"
2021/11/04 04:48:40 [notice] 23077#23077: *4646 "for-sale/([0-9]+)-aaa-(.*)-bbb-(.*)" matches "/for-sale/14808-aaa-35640A-Hwy-60-bbb-Vernon/", client: 172.70.98.47, server: example.com, request: "GET /for-sale/14808-aaa-35640A-Hwy-60-bbb-Vernon/ HTTP/1.1", host: "example.com", referrer: "https://example.com/vernon/"
2021/11/04 04:48:40 [notice] 23077#23077: *4646 rewritten redirect: "/Vernon//35640A-Hwy-60/", client: 172.70.98.47, server: example.com, request: "GET /for-sale/14808-aaa-35640A-Hwy-60-bbb-Vernon/ HTTP/1.1", host: "example.com", referrer: "https://example.com/vernon/"
2021/11/04 04:48:41 [notice] 23077#23077: *4649 "for-sale/([0-9]+)-aaa-(.*)-bbb-(.*)" does not match "/for-sale/19617-2926-DEER-HILL-Road-Heber-Arizona-85928/", client: 108.162.245.49, server: example.com, request: "GET /for-sale/19617-2926-DEER-HILL-Road-Heber-Arizona-85928/ HTTP/1.1", host: "example.com"
2021/11/04 04:48:41 [notice] 23077#23077: *4651 "for-sale/([0-9]+)-aaa-(.*)-bbb-(.*)" matches "/for-sale/6944-aaa-35640-Hwy-60-bbb-Vernon/", client: 172.69.35.180, server: example.com, request: "GET /for-sale/6944-aaa-35640-Hwy-60-bbb-Vernon/ HTTP/1.1", host: "example.com", referrer: "https://example.com/vernon/"
2021/11/04 04:48:41 [notice] 23077#23077: *4651 rewritten redirect: "/Vernon//35640-Hwy-60/", client: 172.69.35.180, server: example.com, request: "GET /for-sale/6944-aaa-35640-Hwy-60-bbb-Vernon/ HTTP/1.1", host: "example.com", referrer: "https://example.com/vernon/"
2021/11/04 04:48:42 [notice] 23077#23077: *4654 "for-sale/([0-9]+)-aaa-(.*)-bbb-(.*)" matches "/for-sale/18232-aaa-72-County-Road-8144-bbb-Vernon/", client: 172.172.35.168, server: example.com, request: "GET /for-sale/18232-aaa-72-County-Road-8144-bbb-Vernon/ HTTP/1.1", host: "example.com", referrer: "https://example.com/vernon/"
2021/11/04 04:48:42 [notice] 23077#23077: *4654 rewritten redirect: "/Vernon//72-County-Road-8144/", client: 172.172.35.168, server: example.com, request: "GET /for-sale/18232-aaa-72-County-Road-8144-bbb-Vernon/ HTTP/1.1", host: "example.com", referrer: "https://example.com/vernon/"

I'm not sure if I'm headed down the right path here, or is a rewrite rule wrong to be using in this scenario? I've tried placing the rewrite rule in it's own location, and tried different flags but this is the closest I have got so far.

Here is my full config. Thanks for any help.

server {

  server_name example.com www.example.com;

    access_log /var/www/example.com/logs/access.log;
    error_log /var/www/example.com/logs/error.log;
    rewrite_log on;
    root /var/www/example.com/public;
    index index.php;


    listen 443 ssl http2; # managed by Certbot
    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
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


location / {

rewrite for-sale/([0-9]+)-aaa-(.*)-bbb-(.*) /$3/$2/ permanent;
        try_files $uri $uri/ /index.php?$args;

        }


        # fastcgi
        location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS on;
        fastcgi_param HTTP_SCHEME https;
        fastcgi_read_timeout 150;
        }

        #Cache static files for as long as possible
        location ~*.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz)$ {       expires 365d;
        }
        location ~ ^/(wp-admin|wp-login|ngx_pagespeed_statistics|ngx_pagespeed_global_statistics|ngx_pagespeed_message)$ {       #auth_basic "Private";
        auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
        }

        location ~* /wp-includes/.*.php$ {
        deny all;
        access_log off;
        log_not_found off;
        }
        location ~* /wp-content/.*.php$ {
        deny all;
        access_log off;
        log_not_found off;
        }



}

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


    server_name example.com www.example.com;


    listen 80;
    return 404; # managed by Certbot


}
Ivan Shatsky avatar
флаг gr
Вы получили настроенную страницу 404 WordPress или необработанную страницу nginx? Похоже, это WP, который не понял ваш переписанный URI. Вы можете вручную проверить это, введя `https://example.com/Vernon//72-County-Road-8144/` в адресной строке браузера.
David avatar
флаг my
Да, это 404 от WordPress. "Страница не найдена". Исходная рассматриваемая страница была бы https://example.com/for-sale/12356-aaa-72-County-Road-8144-bbb-Vernon/, и я пытаюсь по-прежнему обслуживать эту страницу, но с URL-адресом отображается как https://example.com/vernon/72-County-Road-8144/, и похоже, что WordPress ожидает, что эта страница будет существовать в последнем месте? Любые идеи, что мне нужно изучить? Спасибо за вашу помощь.
Ivan Shatsky avatar
флаг gr
Да, WordPress ожидает, что эта страница существует.Хотя теоретически можно сделать и наоборот, переписав внутренний URI `/vernon/72-County-Road-8144` на `/for-sale/12356-aaa-72-County-Road-8144-bbb- Vernon` (если у вас есть алгоритм для обратной перезаписи) и просите WP core обслуживать переписанную страницу, в то время как в адресной строке вашего браузера будет отображаться исходный URL-адрес, мне кажется, что что бы вы ни пытались сделать, вы выбираете неправильный способ сделать это.
David avatar
флаг my
Да, я боялся, что, возможно, я поступаю неправильно. К сожалению, это плагин для недвижимости, который генерирует структуру URL, которую я пытаюсь изменить, и невозможно изменить структуру постоянных ссылок в настройках плагина, чтобы он сначала отображал город, затем адрес и т. д. Когда я связался с разработчиком они предложили мне изучить переписывание URL-адреса на стороне сервера. Но теперь я вижу, что с WordPress я не могу просто заставить Nginx переписать его, как я думал.
djdomi avatar
флаг za
https://www.cyberciti.biz/faq/how-to-configure-nginx-for-wordpress-permalinks/ может быть шансом для этого решения с постоянными ссылками
Рейтинг:0
флаг gr

Это не ответ, но он слишком длинный, чтобы быть комментарием, поэтому я пишу это как ответ.

То, чего вы пытаетесь достичь, возможно. Однако для его реализации вам понадобится более сложный программный стек. Вам понадобится некоторое хранилище значений ключа (например, Редис) и веб-сервер, способный использовать его при обслуживании запроса (например, nginx с lua-nginx-модуль и Луа-Рести-Редис).

Вот (один из) возможных алгоритмов.

  • Получив запрос, проверьте, есть ли в хранилище какое-либо значение, используя URI запроса в качестве ключа.
    • Если это так, получите значение из хранилища и используйте его как URI для WordPress.
    • Если это не так, проверьте, соответствует ли URI нашему шаблону регулярного выражения.
      • Если это так, сделайте следующее:
        • генерировать перезаписанный URI;
        • хранить исходные и переписанные URI как ключ/значение в хранилище;
        • вернуть перенаправление с новым URI.
      • Если это не так, обслуживайте наш запрос URI обычным способом.

Полный рецепт реализации этого стека определенно выходит за рамки обычного ответа ServerFault, но вы можете принять это как идею.

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

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