在.htaccess

时间:2015-09-23 18:27:56

标签: regex .htaccess url-rewriting

我正在尝试使用正则表达式创建.htaccess重写规则,以在_之前的网址中将-的所有实例替换为?。表达式不应该影响查询字符串,只影响URL。

例如,这个:

/north_america/united_states/california/?search=1&location=ca_orange_county&city=buena_park  
/united_states/california/?search=1&location=ca_orange_county&city=buena_park  
/united_states/south_carolina/?add-place=place_name  
/canada/british_columbia/bc/?search=1&city=vancouver
/add_listing/?listing_type=place&package_id=12  

将替换为:

/north-america/united-states/california/?search=1&location=ca_orange_county&city=buena_park  
/united-states/california/?search=1&location=ca_orange_county&city=buena_park  
/united-states/south-carolina/?add-place=place_name  
/canada/british-columbia/bc/?search=1&city=vancouver  
/add-listing/?listing_type=place&package_id=12  

3 个答案:

答案 0 :(得分:0)

要在URL中将下划线连接到连字符:

RewriteRule /?(\w*)_(\w*)/ /$1-$2/

demo

答案 1 :(得分:0)

要在单个重定向中用连字符替换所有下划线,您可以使用以下两个规则:

RewriteEngine On

RewriteRule ^([^_]*)_+([^_]*)$ /$1-$2 [L,R=302]

RewriteRule ^([^_]*)_+([^_]*_+.*)$ $1-$2 [L]

答案 2 :(得分:0)

除非%{QUERY_STRING}在RewriteCond中,否则RewriteRule不会影响查询字符串。因此,一个简单的递归规则应该这样做:

RewriteRule ^([^_]*)_(.*)$ /$1-$2 [N]

匹配:

  • 任意数量的非下划线(引用$ 1,可能为空)
  • 一个下划线
  • 其余的(引用$ 1,可能为空)
  • 并且N flag用于递归重写规则,并且一旦所有下划线都被更改,此规则将不再匹配,因为下划线必须匹配,然后递归中断