Я пытаюсь переписать следующее для сайта 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;