Apache 将分数改写为破折号

Apache 将分数改写为破折号,apache,.htaccess,mod-rewrite,url-rewriting,opencart,Apache,.htaccess,Mod Rewrite,Url Rewriting,Opencart,我知道有很多关于将下划线改写为破折号的问题和答案,但我似乎无法让它适用于这种特殊情况 我正在将现有的web商店转换为Opencart。出于某种奇怪的原因,旧商店在类别名称中使用破折号,但在产品中使用下划线。因此,现有URL如下所示: www.example.com/category-name/product_name RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^_]*)_([^_]*_.*) $1-$

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

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

www.example.com/category-name/product_name
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [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_=$1 [L,QSA]
我想把这些重写为:

www.example.com/category-name/product-name
到目前为止,我拥有的.htaccess规则如下:

www.example.com/category-name/product_name
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [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_=$1 [L,QSA]
第一部分重写下划线,第二部分重定向到index.php。虽然这可以很好地重写:

www.example.com/category-name/product_name
致:

当我输入以下url时,它会完全崩溃:

www.example.com/category-name/product_name_with_more_underscores
任何帮助或指示都将受到感激

谢谢。

就这样吧:

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

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

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

谢谢你的回答。虽然它不再在/category name/product\u name\u上崩溃,但它也不再重写它。理想情况下,我需要它重写为/类别名称/产品名称与更多的下划线。很多人都很感激,但事实上这对我很有效<代码>http://localhost/category-name/product_name_with_more_underscores已重定向到
http://localhost/category-name/product-name-with-more-underscores
用连字符替换所有下划线。请确保这是您的.htaccess中的第一条规则,并且没有其他.htaccess再次尝试更新规则,您可能没有
RewriteBase
。这给了我一个服务器错误,但删除/in RewriteRule^([^\u]*)$/$1-$2[L,R=302,NE]并将RewriteBase/in放在最上面起作用。你是上帝。我跪在你无限的知识面前。谢谢你。。。我对此有进一步的疑问,但我将其作为一个新问题发布,因为它与我在这里提出的问题略有不同: