如何编写NGINX Rewrite规则去除URL中/filters/后的所有内容?
解决方案
得在Nginx的server块里,把下面这条rewrite规则放在location ~ ^/index\.php(/|$)前面,用来匹配带/filters/的URL,内部把请求重写到去掉/filters/及后面内容的路径,浏览器地址栏不会变。
规则代码:
rewrite ^(/.*)/filters/.*$ $1 last;
这条规则的逻辑:
- 匹配所有以任意路径开头、后跟
/filters/及任意内容的URL - 将请求的URI替换为
/filters/之前的部分(比如/main-category/category/filters/price:0-100会被改成/main-category/category/) last表示执行完这条规则后,重新匹配Nginx的location规则,确保请求能落到处理Symfony的PHP配置里
结合你现有配置,完整的server块示例:
server { listen 80; server_name domain.tld; root /path/to/your/symfony/public; # 先添加这条rewrite规则 rewrite ^(/.*)/filters/.*$ $1 last; location ~ ^/index\.php(/|$) { include fastcgi_params; fastcgi_pass php_project:9000; fastcgi_read_timeout 600s; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; internal; } # 补充静态文件及默认路由处理 location / { try_files $uri $uri/ /index.php$is_args$args; } }
注意事项:
- 规则必须放在PHP的location配置之前,否则Nginx会先匹配到PHP规则,这条重写不会生效
- 如果需要在Symfony中读取过滤参数(比如价格范围),可以通过
$_SERVER['REQUEST_URI']或者Symfony的Request对象获取原始URL后解析
内容的提问来源于stack exchange,提问作者Sander Drenth
相关产品推荐
相关产品推荐

