这一个可能已经回答,但我似乎找不到一个适合我的细节。所以道歉,如果它听起来很老。
我的重写包括使用重写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
-在U
和I
之间分隔
或
U951.
-在U
和.
之间分隔
我是这样开始的:
RewriteRule "^gallery/(\d+)/(\s+)$"
但这是我能找到的最远的地方。
1条答案
按热度按时间ercv8c1e1#
您可以执行以下操作:
我假设被重定向到的域驻留在不同的服务器上,否则(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
指令)中捕获的组。