【问题标题】:Search and replace in apache htaccess a RewriteRule在 apache htaccess 中搜索和替换 RewriteRule
【发布时间】:2009-05-28 05:57:19
【问题描述】:

我基本上想得到

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

改写成

/path/file name with plusses.mp3

在我的情况下,wordpress 正在拦截请求并给出 404。但该文件确实存在。

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

【问题讨论】:

  • 对于其他有类似问题的人,您可以使用百分比编码的字符链接到此类文件,例如该链接应该是/path/file%20name%20with%20plusses.mp3

标签: apache mod-rewrite


【解决方案1】:

试试这个规则:

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

【讨论】:

  • 在我的情况下,这似乎没有做任何事情,但即使它做了......它看起来用空格替换单个 +,但只有第一个。我错了吗?同样,将 + 更改为 %20 也将变得很漂亮,这也毫无价值。 :)
  • N 标志将导致重复(与编程语言中的continue 相同),直到没有加号为止。对我来说,它就像一种魅力。
  • 对我来说,它使 Apache RewriteRule: cannot compile regular expression '^([^+]*)\\(.*)' [crit] Memory allocation failed, aborting process. 崩溃。
  • @Binyamin 您需要[^…] 中的分隔符,所以在您的情况下为[^\\]*
  • 我被要求 301 重定向所有包含空格或 ASCII 编码 %20 的 URL,并用加号替换它们。我试过RewriteRule ^([^(\s|%20)]*)(\s|%20)(.*) $1+$2 [N,R=301],但它似乎没有做任何事情。有人有想法吗?
【解决方案2】:

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

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

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

RewriteCond %{REQUEST_URI}(这是我们不需要的)+

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

解释:

第一行:

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

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

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

标志: N :在此之后,再次执行,再次执行所有重写规则,但使用更改后的 url L :如果有匹配,请停在这里(这两个标志实际上使您对第一个标志的期望达到了。)

第二行

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

第三行

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我有一个更好的 - 使用 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" );
      
      ?>
      

      上面的这个处理德语变音字符,但它适用于“_”到“-”等更简单的情况......

      【讨论】:

        猜你喜欢
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-13
        • 2014-08-19
        相关资源
        最近更新 更多