在apache中搜索和替换htaccess一个RewriteRule

时间:2009-05-28 05:57:19

标签: apache mod-rewrite

我基本上想要

/path/file+name+with+plusses.mp3

重写为

/path/file name with plusses.mp3

在我的情况下,wordpress正在拦截请求并提供404.但文件确实存在。

鉴于mod_rewrite实现中正则表达式的限制,我还没有看到一种直接的方法。

4 个答案:

答案 0 :(得分:8)

尝试此规则:

RewriteRule ^([^+]*)\+(.*) $1\ $2 [N]

答案 1 :(得分:1)

嗯,我确实有一个解决方案,但我真的不喜欢它...... 这将用破折号替换所有下划线,并使用301状态代码重定向, 这是'永久移动'。 (当然你也可以用它代替任何其他的字符)

此外,它应该是第一个规则(对于.htaccess文件中的ex),因为第一行实际上是一个循环,它再次遍历所有规则(因为N标志)

RewriteRule ^/redirect/from/([^_]*)\_(.*)$ /redirect/from/thisisthethingwedontneed$1-$2 [N,L]
     

RewriteCond%{REQUEST_URI}(thisisthethingwedontneed)+

     

RewriteRule(thisisthethingwedontneed)+(。*)/ url / to / redirect / to / $ 2 [NC,QSA,R = 301]

说明:

第一行:

'redirect / form':基本路径或您想要重定向的任何内容。它应该包含在第二部分中,以便能够在下一次循环运行时匹配它

第一部分:'替换(不是下划线)后跟下划线后跟(任何)'捕获第一部分和最后一部分供以后使用

第二部分:在捕获的第一部分之前插入一些可能在您的网址中找不到的文字,然后追加第一部分,然后是破折号,然后是第二部分

国旗: N:在此之后,再次继续,再次执行所有重写规则,但使用更改的URL L:如果有比赛,请停在这里(2个标志一起实际上是你想要的第一个。)

第二行

下一条规则的条件:只有在请求uri中找到先前定义的字符串时才执行下一条规则,至少一次

第三行

第一部分:匹配并捕获任何有趣字符串的出现,并捕获所有内容 之后

第二部分:将第二部分追加到我们想要重定向到的任何路径(并忘记有趣的字符串)

标志: NC:不区分大小写 QSA:附加任何查询字符串 R = 301:永久移动重定向

答案 2 :(得分:0)

我并不完全相信mod_rewrite会为你解决这个问题,因为+是一个完全合法的查询字符串字符。如果您在网站的根目录中安装了Wordpress,则可能会将该部分网址(PathInfo)视为查询字符串参数。

答案 3 :(得分:0)

我有一个更好的 - 用PHP:

htaccess的:

  RewriteCond %{REQUEST_URI} ^/word/[^/]+$
  RewriteRule ^word/(.*)$  http://example.com/special_redirect.php?q=$1 [L,QSA,R=301]

./ special_redirect.php

<?php

$q = $_GET['q'];
$new = strtolower(convert_character($q));

//echo "$q | $new";
$location = "http://" . $new . ".example.com/";
//echo $location;

function convert_character($name) {
  $patterns_raw     = array('Ä',  'ä',  'Ö',  'ö',  'Ü',  'ü', 'ß');
  foreach ($patterns_raw as $pattern_raw) {
    $patterns[] = '/' . $pattern_raw . '/u';
  }

  $replacements = array('ae', 'ae', 'oe', 'oe', 'ue', 'ue', 'ss');
  $new_name = preg_replace($patterns, $replacements, $name);

  return $new_name;
}


Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: $location" );

?>

这可以应对德语变音符号,但它适用于“_”到“ - ”的简单情况等等......