考虑一个.htaccess
必须将所有下划线转换为破折号的文件,并用文件名中的斜杠替换潜在的.html
后缀。
来自客户端的http://foo.com/a_b/c_d.html
示例 URL:要重定向的示例 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
后缀和下划线?
如评论中所述,您发布的指令应该已经达到了您的要求,尽管在两个单独的重定向中。您无需执行任何操作即可启用此行为
.htaccess
- 这就是它的工作原理。可能与其他指令存在某种冲突,但我很难想象哪种冲突会导致您所看到的行为。
但是,您可以组合这两个重定向,因此只有一个重定向。例如:
这会处理以斜杠结尾的 URL 和不以斜杠结尾的 URL(当没有
.html
提供扩展名时) - 如评论中所述。替换中始终包含尾部斜杠。补充说明:
(.*?)
-?
最后捕获的组中的 使正则表达式非贪婪。这是必要的,以免捕获尾部斜杠或.html
扩展名(如果有)。这留给后面的非捕获组......(?:/|\.html)?
- 这是一个非捕获 (?:
) 组,是可选的(尾随?
)。使用交替,它要么匹配尾部斜杠或尾部.html
扩展名,要么根本不匹配。