描述的方法,例如this answer 中的内容应该适合您,只需稍作调整。主要是,您需要添加一些 RewriteConds 以防止它应用于与图像和其他实际文件对应的任何 URL:
# Replace all but the last underscore with dashes internally:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_([^_]*_.*)$ $1-$2 [N]
# Replace the last underscore and issue a HTTP permanent redirect:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]
(在现有规则之前添加这些规则,但在 RewriteEngine On 行之后。请注意,如果您知道自己没有并且不会有任何名称中带有下划线的实际文件,则可以省略 RewriteConds。)
您还可以修改这些规则以折叠连续的连字符:
# Collapse all but one group of multiple hyphens internally:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-]*(-[^-]+)*)--+([^-]+(-[^-]+)*--.*)$ $1-$3 [N]
# Collapse the last group of hyphens and issue a HTTP permanent redirect:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-]*(-[^-]+)*)--+([^-]+(-[^-]+)*|)$ /$1-$3 [L,R=301]
甚至同时进行:
# Collapse all but one group of multiple hyphens and/or underscores internally:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-_]*(-[^-_]+)*)(--|-_|_)[-_]*([^-_]+(-[^-_]+)*(--|_).*)$ $1-$4 [N]
# Collapse the last group of hyphens and/or underscores and issue a HTTP permanent redirect:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-_]*(-[^-_]+)*)(--|-_|_)[-_]*([^-_]+(-[^-_]+)*|)$ /$1-$4 [L,R=301]
(免责声明:我没有实际测试过这些规则。我相信它们应该可以工作,但我可能在某个地方打错了。)
这些规则都不会以任何方式影响查询字符串,这可能是您想要的。如果您确实也想替换查询字符串中的下划线和/或多个连续连字符,您可以这样做,例如使用on the Apache httpd wiki here描述的方法。