NGINX переписывает URL-адрес в wordpress, но получает ошибку 404.

У меня есть веб-сайт WordPress, где мои URL-адреса в настоящее время записываются следующим образом
http://example.com/for-sale/12345-aaa-123-street-bbb-city/

, и я хотел бы по-прежнему обслуживать тот же URL-адрес, но я хочу, чтобы URL-адрес выглядел как
http://example.com/city/street/

Я создал правило перезаписиrewrite for-sale/([0-9]+)-aaa-(.*)-bbb-(.*) /$3/$2/ permanent;

Это действительно переписывает мой URL-адрес, но возвращает ошибку 404. Вот что возвращает журнал перезаписи

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/"

Я не уверен, что иду по правильному пути, или в этом сценарии неправильно использовать правило перезаписи? Я пытался разместить правило перезаписи в его собственном месте и пробовал разные флаги, но это самое близкое, что у меня есть.

Вот мой полный конфиг. Спасибо за любую помощь.

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


}
0
задан 4 November 2021 в 04:20
1 ответ

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

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

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

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

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

0
ответ дан 4 November 2021 в 20:01

Теги

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