如何 Mod-用最多 4 个变量和新文本将下划线重写为破折号?
How to Mod-Rewrite underscores to dashes with up to 4 variables and new text?
如何 Mod- 使用 1 到 4 个变量和新文本将下划线重写为破折号?
要从这里更改:
https://example.com/Text_var1_var2_var3_var4.html
为此:
https://example.com/NewText-var1-var2-var3-var4.html
我已经试过了,但出现 404 错误:
RewriteRule ^text_([a-zA-Z]+)_?([a-zA-Z]*)_?([a-zA-Z]*)_?\(*([a-zA-Z]*)\)*.html?$ newtext----^.html
我假设这应该是一个外部重定向(为了“更正”URL),而不是内部重写,正如您似乎正在尝试做的那样?
试试这样:
RewriteEngine On
# Handle from 1 to 4 "variables" and "newtext"
RewriteRule ^text_([a-zA-Z0-9]+)\.html$ /newtext-.html [R=302,L]
RewriteRule ^text_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)\.html$ /newtext--.html [R=302,L]
RewriteRule ^text_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)\.html$ /newtext---.html [R=302,L]
RewriteRule ^text_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)\.html$ /newtext----.html [R=302,L]
每个“变量”仅限于字符 a-z
、A-Z
和 0-9
(尽管您在示例指令中省略了数字,但您的示例 URL 严格执行包含数字并且您没有另外说明)。
您可以更“动态地”执行此操作以避免在每个规则中重复 text
和 newtext
,但这可以说会使它变得更复杂并且似乎没有必要考虑它似乎是静态文本替换和有限数量的“变量”。
RewriteRule ^text_([a-zA-Z]+)_?([a-zA-Z]*)_?([a-zA-Z]*)_?\(*([a-zA-Z]*)\)*.html?$ newtext----^.html
这有几个 issues/anomalies:
- 您在 替换 字符串中有一个错误的
^
。
- 您正在尝试在一个指令中处理所有 1 到 4 个 变量。这里的问题是 substitution 字符串中连字符的数量是“固定的”。因此,如果只有一个变量(例如
/text_var.html
),那么生成的替换将是 newtext-var---.html
(如果不是错误的 ^
)——我确定这不是本意.
- 您允许在第 4 个“变量”周围使用任意数量的 可选 括号,但您在要求中没有提及这一点?例如。
/text_one_two_three_(((four).html
会匹配,但只有 one
、two
、three
和 four
会被捕获。
- 这是内部重写,不是外部重定向。因此,除非
/newtext-var1-var2-var3-var4.html
映射到物理文件,否则这需要进一步重写才能正确解析(这不太可能起作用)。
如何 Mod- 使用 1 到 4 个变量和新文本将下划线重写为破折号?
要从这里更改:
https://example.com/Text_var1_var2_var3_var4.html
为此:
https://example.com/NewText-var1-var2-var3-var4.html
我已经试过了,但出现 404 错误:
RewriteRule ^text_([a-zA-Z]+)_?([a-zA-Z]*)_?([a-zA-Z]*)_?\(*([a-zA-Z]*)\)*.html?$ newtext----^.html
我假设这应该是一个外部重定向(为了“更正”URL),而不是内部重写,正如您似乎正在尝试做的那样?
试试这样:
RewriteEngine On
# Handle from 1 to 4 "variables" and "newtext"
RewriteRule ^text_([a-zA-Z0-9]+)\.html$ /newtext-.html [R=302,L]
RewriteRule ^text_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)\.html$ /newtext--.html [R=302,L]
RewriteRule ^text_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)\.html$ /newtext---.html [R=302,L]
RewriteRule ^text_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)_([a-zA-Z0-9]+)\.html$ /newtext----.html [R=302,L]
每个“变量”仅限于字符 a-z
、A-Z
和 0-9
(尽管您在示例指令中省略了数字,但您的示例 URL 严格执行包含数字并且您没有另外说明)。
您可以更“动态地”执行此操作以避免在每个规则中重复 text
和 newtext
,但这可以说会使它变得更复杂并且似乎没有必要考虑它似乎是静态文本替换和有限数量的“变量”。
RewriteRule ^text_([a-zA-Z]+)_?([a-zA-Z]*)_?([a-zA-Z]*)_?\(*([a-zA-Z]*)\)*.html?$ newtext----^.html
这有几个 issues/anomalies:
- 您在 替换 字符串中有一个错误的
^
。 - 您正在尝试在一个指令中处理所有 1 到 4 个 变量。这里的问题是 substitution 字符串中连字符的数量是“固定的”。因此,如果只有一个变量(例如
/text_var.html
),那么生成的替换将是newtext-var---.html
(如果不是错误的^
)——我确定这不是本意. - 您允许在第 4 个“变量”周围使用任意数量的 可选 括号,但您在要求中没有提及这一点?例如。
/text_one_two_three_(((four).html
会匹配,但只有one
、two
、three
和four
会被捕获。 - 这是内部重写,不是外部重定向。因此,除非
/newtext-var1-var2-var3-var4.html
映射到物理文件,否则这需要进一步重写才能正确解析(这不太可能起作用)。