我正在尝试为 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;