Nginx Rewrite / product_category / Wordpress

Я пытаюсь переписать следующее для сайта WordPress / Woocommerce:

/product_category/example-category/
/product/example-product/

на ...

/example-category/
/example-product/

, используя следующие правила:

server {

listen      10.99.0.3:8080;

server_name    www.example.com;

root /home/www.example.com/public_html;
index index.html index.htm index.php;

rewrite ^/product-category/1$ /;
rewrite ^/product/1$ /;

include conf.d/whitelisted.conf;
include conf.d/wp/restrictions.conf;
include conf.d/wp/wordpress.conf;

 }

... и вот правила wordpress.conf, включенные из отдельного файла:

location / {
  try_files $uri $uri/ /index.php?$args;
}

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
   access_log off; log_not_found off; expires max;
}

location ~* /(?:uploads|files)/.*\.php$ {
  deny all;
}

location ~* /wp-content/.*\.php$ {
  deny all;
}

location ~* /wp-includes/.*\.php$ {
  deny all;
}

location ~* /(?:uploads|files|wp-content|wp-includes)/.*\.php$ {
  deny all;
}

location ~ [^/]\.php(/|$) {
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  if (!-f $document_root$fastcgi_script_name) {
    return 404;
  }

  include fastcgi_params;
  fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
  fastcgi_index index.php;
  include /etc/nginx/fastcgi_params;

  fastcgi_buffer_size 128k;
  fastcgi_buffers 256 16k;
  fastcgi_busy_buffers_size 256k;
  fastcgi_temp_file_write_size 256k;
  fastcgi_read_timeout 1800;  

}

но Nginx, похоже, игнорирует правила перезаписи, которые я указываю для перезаписи продукта cat / product, как будто их не существует. Например, если я посещаю:

http://www.example.com/product-category/footwear/

вместо того, чтобы переписывать на:

http://www.example.com/footwear/

, он просто обслуживает:

http://www.example.com/product-category/footwear/

Что я делаю не так? Спасибо!

1
задан 20 September 2016 в 08:34
1 ответ

Ваши переписывания используют регулярные выражения, и, что интересно, они установлены на соответствие только определенным URL.

rewrite ^/product-category/1$ /;
rewrite ^/product/1$ /;

Таким образом, только URL /категория продуктов/1 и /продукт/1 будут соответствовать этим директивам. Ни /product/2, ни /product/air-jordan-1-retro-high-og-banned-2016-release не будут совпадать.

Я думаю, что вместо этого вы хотите перехватить оставшийся URL и использовать его в URL назначения.

rewrite ^/product-category/(.*) /$1;
rewrite ^/product/(.*) /$1;

Но подождите, это еще не все! Вы не указали необязательный флаг для директивы rewrite. Итак, после перезаписи URL, nginx продолжает свой путь через конфигурацию. Он не начинает заново обрабатывать запрос и не перенаправляет пользовательского агента. Это может сбить с толку WordPress. Если вы хотите переадресацию (например, для SEO), то вам следует добавить соответствующий флаг.

rewrite ^/product-category/(.*) /$1 permanent;
rewrite ^/product/(.*) /$1 permanent;
0
ответ дан 4 December 2019 в 05:52

Теги

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