regex - 将 url 重定向到 url 到 www
问题描述
我在 nginx 中将 url 重定向到 url 时遇到问题:
例如我有一个链接:
https://example.com/oferty-specjalne/szczegoly-oferty?OfferID=124296
工作功能:
location ^/oferty-specjalne/szczegoly-oferty(.*)$ {
return 301 https://example.com/oferty-specjalne/; }
不工作的功能:
location ~ ^/oferty-specjalne/szczegoly-oferty\?OfferID=(124170|124296|124299|123483|63788|97002)$ {
return 301 https://example.com/oferty-specjalne/; }
location ~ ^/oferty-specjalne/szczegoly-oferty?OfferID=(.*)$ {
return 301 https://example.com/oferty-specjalne/$1; }
location ^/oferty-specjalne/szczegoly-oferty?OfferID=97002 {
return 301 https://example.com/oferty-specjalne/; }
我检查了测试人员中的正则表达式,一切正常。我正在询问我在哪里犯了错误以及如何解决它,或者例如。
解决方案
URI 后面的部分?
是查询字符串(或参数),而不是location
andrewrite
指令使用的规范化 URI 的一部分 - 所以你的规则永远不会匹配。有关详细信息,请参阅此文档。
如果您有复杂的正则表达式需要匹配整个 URI(包括查询字符串),您需要使用该$request_uri
变量。这可以使用 aif
或 a进行测试map
。对于多个正则表达式,amap
是首选解决方案。
例如:
map $request_uri $redirect {
default 0;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=(124170|124296|124299|123483|63788|97002)$
/oferty-specjalne/;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=(?<offerid>.*)$ /oferty-specjalne/$offerid;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=97002 /oferty-specjalne/;
~^/oferty-specjalne/szczegoly-oferty /oferty-specjalne/;
}
server {
...
if ($redirect) {
return 301 $redirect;
}
正则表达式按顺序计算,直到找到匹配的规则,因此将最具体的规则排在最前面,最后将最不具体的规则排序。使用命名捕获,因为数字捕获可能超出范围。如果它们相同,则不需要指定方案或域名。该map
指令位于 `server 块之外。有关详细信息,请参阅此文档。
推荐阅读
- php - 解析错误:语法错误、意外的 '?>'、期望函数 (T_FUNCTION) 或 const (T_CONST)
- c++ - SDL2_pollevent() 控制器 dpad 连续保持?
- python - Tensorflow 中 sess.run(c) 和 c.eval() 的区别
- ios - 根据价格对核心数据进行排序
- r - 在数百万个坐标中按组计算最大距离
- cassandra - tombstone_failure_threshold 为每个表或整个 cassanandra 集群维护
- android - 在 Titanium 应用程序中添加 benCoding.AlarmManager 模块时应用程序崩溃
- ios - 谷歌地图 GMSMarker 改变相机焦点 iOS
- photoeditorsdk - 将 PESDK 主题更改为白色
- java - BufferedReader(System.in) readLine() 方法返回 IOException,Stream 已关闭