apache 重定向至在RewriteMap中查找到新“ID”的新URL,RewriteMap出现在目标URL的两个位置

rm5edbpk  于 2023-02-13  发布在  Apache
关注(0)|答案(1)|浏览(105)

这一个可能已经回答,但我似乎找不到一个适合我的细节。所以道歉,如果它听起来很老。
我的重写包括使用重写Map和重定向到另一个域。
例如:
旧站点已移动,生成了新ID,同时文件名也发生了更改
所以这个网址:

https://www.example.com/gallery/951/med_U951I1424251158.SEQ.0.jpg

需要重定向到

https://www.example2.com/gallery/5710/med_U5710I1424251158.SEQ.0.jpg

新值5710来自重写Map查找,我在其中传递951
需要进行两次变更,第二次变更有两种可能的变化:
1.第一个更改是将gallery/951更改为gallery/5710

  • 第二个更改是文件名,其中 * id * 可以用以下两种方式之一分隔:
  • U951I-在UI之间分隔

  • U951.-在U.之间分隔

我是这样开始的:

RewriteRule "^gallery/(\d+)/(\s+)$"

但这是我能找到的最远的地方。

ercv8c1e

ercv8c1e1#

您可以执行以下操作:

RewriteCond ${MapName:$1|XXX} (.+)
RewriteRule ^/?gallery/(\d+)/(.*U)\1([I.][^/]+)$ https://www.example2.com/gallery/%1/$2%1$3 [R=302,L]

我假设被重定向到的域驻留在不同的服务器上,否则(if this is in .htaccess)您将需要在额外的 * condition *(RewriteCond指令)中检查请求的主机名。
说明:

  • 正则表达式^/?gallery/(\d+)/(.*U)\1([I.][^/]+)$匹配并 * 捕获 * 源URL的相关部分...
  • ^/?gallery/-文本(可选斜杠前缀,如果在 * server * 上下文中使用,而不是.htaccess
  • (\d+)-捕获"旧"成员ID(以后可使用$1反向引用获得,并用于从RewriteMap查找"新"成员ID)
  • /-文字斜杠
  • (.*U)-捕获"旧"成员ID之前的文件名的第一部分。稍后在$2反向引用中提供。
  • \1-内部反向引用与第2个路径段中出现的"旧"成员ID匹配-未捕获。
  • ([I.][^/]+)$-捕获"旧"成员ID * 之后 * 的文件名最后一部分-稍后在$3反向引用中提供。字符类[I.]I或文本.匹配(在字符类中使用时,点不需要转义)。并且[^/]+匹配文件名末尾(URL路径)之后的所有内容。
  • RewriteCond指令用于在服务器配置中先前定义的重写Map中查找新成员ID(使用$1反向引用中保存的旧成员ID)。然后捕获结果,稍后在%1反向引用中提供该结果。我设置了默认的XXX,以便很容易发现任何失败的查找。

使用RewriteCond指令意味着我们只查找重写Map一次(结果可能会被缓存,但它至少节省了重复)。

  • /%1/$2%1$3-然后从前面捕获的反向引用构造 * substitution * 字符串:
  • %1是新成员ID(在前面的 * CondPattern * 中捕获)
  • $2是成员ID * 之前 * 的文件名部分(由RewriteRule * 模式 * 根据URL路径捕获)。
  • $3是文件名中成员ID * 之后 * 的部分。

请注意,$n形式的反向引用是指RewriteRule * pattern * 中捕获的组,%n形式的反向引用是指最后匹配的 * CondPattern *(RewriteCond指令)中捕获的组。

相关问题