考虑一个.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
扩展名,要么什么都不匹配。