将下划线重写为破折号

Rewrite undescores to dashes

我知道有很多关于将下划线重写为破折号的现有问题和答案,但我似乎无法让它在这种特殊情况下工作。

我正在将现有的网上商店转换为 Opencart。出于某种奇怪的原因,旧商店在类别名称中使用破折号,但在产品中使用下划线。所以现有url如下:

www.example.com/category-name/product_name

我想将这些重写为:

www.example.com/category-name/product-name

我目前拥有的.htaccess规则如下:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_([^_]*_.*) - [N]
RewriteRule ^([^_]*)_([^_]*)$ /- [L,R=301]    

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_= [L,QSA]

第一节重写下划线,第二节重定向到index.php。虽然这可以很好地重写:

www.example.com/category-name/product_name

至:

www.example.com/category-name/product-name

当我输入 url 例如:

时,Apache 完全崩溃了
www.example.com/category-name/product_name_with_more_underscores

如有任何帮助或指导,我们将不胜感激。

谢谢。

这样说:

# executes when there is exactly 1 space in URI
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_([^_]*)$ /- [L,R=302,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_+(.+)$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(ico|gif|jpg|jpeg|png|js|css)$ [NC]
RewriteRule ^(.*)$ index.php?_route_= [L,QSA]