旧版本的过滤器和排序创建了类似的链接(每个部分的解释如下 - 这里是使用不同视图和过滤器的同一类别的示例):
https://example.com/category-one/1/default/1/f_at_175_3/1
https://example.com/category-two/1/full/3/f_at_185_1/1
https://example.com/category-three/1/default/1/f_at_175_3/1/f_producer_7/1
https://example.com/category-name-and-size-40x40/1/default/1/f_at_175_3/1/f_producer_7/1
我们需要将它们重定向到新链接:
https://example.com/category1/1/
这是我目前的代码。当我使用“htaccess checker”工具时,当我使用标志“R=301”时,会出现如下错误 - 那么在这种情况下是否可以使用 301?:
“无效行:RewriteRule 无效,它在模式或替换中包含空格吗?”
RewriteEngine on
RewriteRule ^([a-z0-9-]+)/[0-9]{1,2}/(default|full)/[1-9](/f_[A-Za-z]+_[0-9]{1,3}(_[0-9]{1,2})?/1)+/?$ /$1/ [R=301, L]
详细信息:
这些链接的结构如下:
https://example.com/category/A/default/B/f_filter_C_D/E
category
- 每个类别名称均独一无二A
- 当前查看的页面数量,因此我们可以有例如 10 个 X 类别的页面 - 在这种情况下,这里会出现 1-10 个数字default
- 定义视图类型(网格或列表),只有 2 个选项:“默认”和“完整”B
- 排序ID(按名称、价格等),只有4种排序类型(1、2、3、4)f_
- 是每次选择任何过滤器时出现的固定部分。filter
- 定义使用的过滤器类型,有以下几种类型(at、producer、color 等)C
- 过滤器的 ID,这里有各种数字(1-999)D
- 我不确定这个数字有什么用,但它总是出现在“过滤器”部分之后(范围为 1-99)E
- 未知数字,但这里始终为“1”
.htaccess 文件内没有其他引用类别链接的指令。
答案1
RewriteRule ^([a-z0-9-]+)/[0-9]{1,2}/(default|full)/[1-9](/f_[A-Za-z]+_[0-9]{1,3}(_[0-9]{1,2})?/1)+/?$ /$1/ [R=301, L]
该指令“无效”,因为它包含空间在里面RewriteRule
旗帜(第三个)论点[R=301, L]
——它应该是[R=301,L]
。空间是中的分隔符.htaccess
,因此这实际上将第三个参数一分为二。(该工具报告的错误并不完全正确,或者充其量只是含糊其辞。)
但是,你没有捕获第二条路径段,即1
(或A
在你的结构分解)。因此,这将重定向到/category1/
,而不是/category1/1/
,如您的示例中所示。
否则,您的指令/正则表达式似乎没问题。
请在文件顶部尝试以下内容.htaccess
。
RewriteRule ^([\w-]+/\d{1,2}/)(default|full)/\d(/f_[a-zA-Z]+_\d{1,3}(_\d{1,2})?/1)+$ /$1 [R=302,L]
补充笔记:
- 反向
$1
引用现在包含A
尾部斜杠,因此应该从代换细绳。 - 我已经删除了模式中的可选尾随斜杠,因为它不存在于您的示例 URL 中或 URL 格式的描述中。
- 我使用简写字符类
\w
来匹配类别。这与您所述的字符相匹配A-Z
,_
但略短一些。 - 我使用了
\d
而不是[0-9]
(和[1-9]
)——只是稍微短一点。
测试前您需要清除浏览器缓存。首先使用 302(临时)重定向进行测试,以避免错误的缓存问题。
更新:(从评论来看)“页码”(第二个路径段)应该构成目标 URL 中其自身 URL 参数的一部分(而不是附加路径段,紧接着类别),因此需要单独捕获。而且尾部斜线似乎不是必需的。
因此,应将其改为:
RewriteRule ^([\w-]+)/(\d{1,2})/(default|full)/\d(/f_[a-zA-Z]+_\d{1,3}(_\d{1,2})?/1)+$ /$1?page=$2 [R=302,L]
QSA
如果可能需要传递到目标 URL 的附加查询字符串,您还需要添加标志。
答案2
是的,我没有提到类别名称也包含-
- 不是_
。有时还有尺寸数字。我在上一篇文章中编辑了我的示例。
另外,我忘记重定向到特定页面数量,因此这里是新版本:
RewriteEngine on
RewriteRule ^([a-z0-9-]+)/(\d{1,2})/(default|full)/[1-9](/f_[A-Za-z]+_\d{1,3}(_\d{1,2})?/1)+/?$ /$1?page=$2 [R=301,L]
因此现在我们从/category-name-40x40/16/default/1/f_producer_41/1/f_at_173_23/1重定向
到:
/category-name-40x40?page=16