【问题标题】:How to use apache's mod_rewrite rewriterule without changing relative paths如何在不更改相对路径的情况下使用 apache 的 mod_rewrite 重写器
【发布时间】:2008-09-27 22:41:49
【问题描述】:

我在 .htaccess 中有以下重写规则:

RewriteRule ^groups/([^/\.]+)/?$  groupdetail.php?gname=$1 [L,NC]

这需要类似 www.example.com/groups/groupname 并调用 www.example/groupdetail.php?gname=groupname。而且效果很好。

但是 groupdetail.php 上的所有相对链接都使用 groups/ 作为相对路径,我不希望他们这样做。我该如何避免这种情况?

例如,当用户单击 groupdetail.php?gname=groupname 上的链接 <a href="link.php"> 时,他会转到 www.example/groups/link.php。我想把用户带到 www.example.com/link.php。

显然,我希望用户的 URL 看起来像“www.example.com/groups/groupname”,所以我不想使用 [R]/redirect。

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    如果您像我一样在页面中有数百个相对链接,请在 <head> 中插入带有绝对路径的 <base href="">(也可以使用相对路径)。您还需要在<head> 中创建.js 文件的绝对路径,因为IE 和firefox 以不同的方式处理基本href。我同意这是一个烦人的问题。

    【讨论】:

    • 注意IE9等浏览器不支持base href中的相对链接。
    【解决方案2】:

    相对链接由浏览器解析,而不是服务器,所以你不能用 mod_rewrite 做任何事情。

    要么使用相对链接(../link.php),要么使用绝对链接。

    【讨论】:

    • 那么,有人能告诉我这个答案是错还是坏?
    • 跳,我同意你的评论不值得得到 -4,我给了你一个赞成票。
    • 这个答案发生了奇怪的事情......现在它突然又从一个赞成票再次变成-1? ...无论如何,也许我错了,但如果是这样,我想知道为什么!
    • 一个 5 年前的答案,但这对我来说很清楚:'相对链接由浏览器解析'。我怀疑是这样,但没有看到它写在任何地方。谢谢!
    【解决方案3】:

    如果你不想有绝对链接或使用<base>,因为你要移动页面,你可以用php生成base,如下:

    echo '<base href="http://'.$_SERVER['SERVER_NAME'].str_replace("index.php","",$_SERVER['PHP_SELF']).'" />';
    

    【讨论】:

      【解决方案4】:

      如果您将重写规则更改为 force redirect(添加 [R] 选项),那么浏览器将使用 /groupdetail.php URL,并且相关链接将正常工作。但是,这会增加一个重定向并使 URL 不那么漂亮。

      RewriteRule ^groups/([^/.]+)/?$ groupdetail.php?gname=$1 [L,NC,R]
      

      【讨论】:

      • Kevin,是的,这可行,但我希望用户的 URL 看起来像“www.example.com/groups/groupname”,所以我不想使用 [R]/redirect。
      【解决方案5】:

      如果不想使用绝对路径,可以使用 BASE 标记:

      http://www.w3schools.com/tags/tag_base.asp

      【讨论】:

        【解决方案6】:

        Hop 的答案是正确的。浏览器将 www.example.com/groups/groupname 视为地址,因此认为 /groups 是当前目录。因此,像 &lt;a href=link.php&gt; 这样的任何链接都假定位于 /groups 文件夹中。

        当用户将鼠标移到链接上时,他会看到 www.example.com/groups/link.php 作为链接地址。

        解决方案是使用绝对链接——只需在 href 前添加一个斜杠即可:

        &lt;a href=/link.php&gt;

        然后用户将看到 www.example.com/link.php 作为 url。

        也就是说,从您的问题看来,您是故意使用相对链接...您有理由不使用绝对链接吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-02
          • 2014-05-11
          • 2011-07-03
          • 2020-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多