Nginx 重写 /product_category/ Wordpress

Nginx 重写 /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

你的重写正在使用正则表达式,有趣的是,它们被设置为仅匹配特定的 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 将继续顺利地执行配置。它不会重新开始处理请求,也不会重定向用户代理。这可能会导致 WordPress 感到困惑。如果您想要重定向(例如为了 SEO),那么您应该添加适当的标志。

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

相关内容