Назад | Перейти на главную страницу

Nginx Rewrite / категория_продукта / 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 rewrites, как если бы их не было. Например, если я приезжаю:

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

вместо переписывания на:

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

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

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

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

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

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

Итак, только URL /product-category/1 и /product/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 продолжает свой веселый путь через config. Он не начинается с обработки запроса или не перенаправляет пользовательский агент. Это может запутать WordPress. Если вы хотите перенаправление (например, для SEO), вы должны добавить соответствующий флаг.

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