在 .htaccess 中执行两种替换类型

在 .htaccess 中执行两种替换类型

考虑一个.htaccess必须将所有下划线转换为破折号的文件,并.html用文件名中的斜杠替换潜在的后缀。

来自客户端的示例 URL:http://foo.com/a_b/c_d.html
要重定向的示例 URL:http://foo.com/a-b/c-d/

我一直使用这个规则来替换.html后缀:

RewriteRule ^(.*)\.html$ $1/ [R,L]

我已经发现这篇很棒的 serverfault.SE 帖子对于下划线重写:

RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]

然而,仅发生一种替换类型,无论哪个在.htaccess文件中是第一个。我似乎无法配置.htaccess执行两个替换。

这意味着以下代码将替换.html后缀仅有的:

RewriteRule ^(.*)\.html$ $1/ [R,L]
RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]

下面的代码将替换下划线仅有的:

RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]
RewriteRule ^(.*)\.html$ $1/ [R,L]

如何.htaccess配置才能替换.html后缀和下划线?

答案1

正如评论中提到的,您发布的指令应该已经实现了您的要求,尽管是在两个单独的重定向中。您无需执行任何操作即可启用此行为.htaccess- 这就是它的工作原理。

有可能与其他指令存在某种冲突,但我很难想象什么样的冲突会导致您所看到的行为。

但是,你可以将这两个重定向合并起来,这样就只有一个重定向。例如:

RewriteRule ^(.*)_(.*)_(.*)_(.*?)(?:/|\.html)?$ /$1-$2-$3-$4/ [R,L]
RewriteRule ^(.*)_(.*)_(.*?)(?:/|\.html)?$ /$1-$2-$3/ [R,L]
RewriteRule ^(.*)_(.*?)(?:/|\.html)?$ /$1-$2/ [R,L]

这既处理以斜杠结尾的 URL,也处理不以斜杠结尾的 URL(当未.html提供扩展名时)——如评论中所述。结尾的斜杠始终包含在代换

补充笔记:

(.*?)-?最后一个捕获组中的 使正则表达式非贪婪。这是必要的,以便不捕获尾随斜杠或.html扩展名(如果有)。这留给后面的非捕获组...

(?:/|\.html)?- 这是一个非捕获 ( ?:) 组,是可选的(尾随?)。使用交替,它要么匹配尾随斜杠或尾随.html扩展名,要么什么都不匹配。

相关内容