【问题标题】:Can mod_rewrite do math?mod_rewrite 可以做数学吗?
【发布时间】:2010-06-17 16:24:48
【问题描述】:

我计划将我的网站转换为新的 CMS,但我想使用 mod_rewrite 将旧链接无缝重定向到新位置。

问题是我的新博客不会有与旧博客相同的文章编号,因为我会先导入一些旧博客条目。因此,我的 mod_rewrite 需要使用像 old.php?article=125 这样的 URL,进行添加以找出新的文章编号(例如 +200,在本例中),然后重定向到 new.php?i=325

mod_rewrite 可以自己进行添加,还是我需要某种“帮助”脚本来执行此操作?

【问题讨论】:

    标签: regex apache mod-rewrite


    【解决方案1】:

    Mod rewrite 可以做正则表达式。如果您可以将新文章的值定义为相同的 id 加 1000,则可以:

    rewriteRule /article=(\d{1})$ /new.php?i=100$1
    rewriteRule /article=(\d{2})$ /new.php?i=10$1
    rewriteRule /article=(\d{3})$ /new.php?i=1$1
    

    【讨论】:

    • 因为一个目的而拥有三个重写规则是很糟糕的。但它完成了工作,对;)它有点错误,因为我在模式的末尾忘记了一个 $(我修复了)
    • 我确实想到了这一点,我可能会在 1000 之后开始导入帖子。(另外,这会让我看起来像一个非常多产的作家!)+1 聪明
    【解决方案2】:

    它不能做数学。也许你想使用rewrite map

    【讨论】:

      【解决方案3】:

      一种选择是完全忘记 .htaccess 文件中的旧链接。相反,构建一个自定义的404 Not Found 错误页面并将 Apache 配置为在损坏的链接上提供它。该页面将是一个 PHP 脚本,它将针对简单表达式测试 $_SERVER['REQUEST_URI'] 变量:

      <?php
      
      if( substr($_SERVER['REQUEST_URI'], 0, 7)=='old.php' ){
          // Old link found!
      }
      
      ?>
      

      在“找到旧链接”的情况下,可以做进一步处理:

      1. 运行正则表达式以查找文章 ID
      2. 对其进行数学运算并尝试将其与新 ID 进行匹配
      3. 使用 header() 执行永久重定向

      【讨论】:

      • 我喜欢这个想法,尽管可能有更快/更简单的方法来做到这一点。我想知道我是否可以覆盖我的网络主机上的默认错误处理程序?嗯……
      • 到目前为止,我已经能够在我的所有主机帐户中使用 ErrorDocument。我喜欢这种方法,因为它不会为通常占绝大多数的有效链接增加额外的重载。
      • 我喜欢这个解决方案,但是如果您需要 301 重定向来进行 seo?这个解决方案不会先给你一个 404 并告诉谷歌该页面不存在吗??
      • @FeidaKila - PHP 让您可以完全控制 HTTP 标头,包括状态代码。阅读header()函数了解更多详情。
      • 我知道 header 函数,但我猜 apache 在通过 PHP 的 header() 函数进行 301 重定向之前会给出 404 响应(通过 Errordocument)。我错了吗??我应该用浏览器检查一下
      【解决方案4】:

      我相信这正在推动mod_rewrite 的“巫毒魔法”。我会设计一个帮助脚本来跟进,或者在数据库级别实际迁移旧条目。

      后者会给你更好的稳定性和对系统布局的控制。您将拥有所有旧条目的新帖子 ID,并且所有内容应该无缝匹配。

      【讨论】:

      • 啊,但是我希望从 id 0 开始导入几百个旧帖子,然后从停止的地方开始导入较新的集合(来自不同的 CMS)。但正如 SchlaWiener 指出的那样,我可以从 1000 开始第二批导入,然后重写规则很容易,比如 137 => 1137。
      • @ewall:花几个小时将数据按摩到表格中是值得的,而不必依赖mod_rewrite 之类的东西。
      猜你喜欢
      • 2017-09-13
      • 1970-01-01
      • 2017-01-08
      • 2011-01-23
      • 2015-02-28
      • 1970-01-01
      • 2010-10-27
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多