如何阻止mod_rewrite将链接附加到url?

时间:2012-10-23 19:15:53

标签: php .htaccess mod-rewrite

我希望答案会变得如此简单,我会想哭,但我似乎无法弄明白。我是mod_rewrite的新手。

我想将我的链接从domain.com/?p=about更改为domain.com/about*/*(带斜杠)并且工作正常,但每当我转到链接,它会将新链接附加到网址的后面。例如,我有一个关于和一个联系链接。如果我点击它导航到domain.com/about/然后如果我点击联系人,它会导航到domain.com/about/contact/并继续添加链接到网址的末尾。如果我在domain.com并点击一个链接(在这种情况下),它将转到domain.com/about/,如果我再点击4次,我的地址栏会说“domain.com/关于/ about / about / about / about /“我在下面的一个非常简单的例子中复制了这个,我做错了什么?

的.htaccess

RewriteEngine On
RewriteRule ([a-zA-Z0-9]+)/$ index.php?p=$1

的index.php

<a href="about/">about</a> | <a href="contact/">contact</a><br><br>

<?php
    if(!isset($_GET['p'])) {
        echo "home";
    } else {
        echo $_GET['p'];
    }
?>

感谢您的帮助!

编辑: 如果我使用绝对路径,它可以正常工作,但如果我不是绝对必须的话,我宁愿不这样做。

edit2:添加

RewriteBase /

打破链接。他们似乎要访问domain.com/about/和... / contact /,但我得到了404 - 我假设我使用的规则与我正在进行链接的方式不相符,这就是为什么我也包括了index.php。

3 个答案:

答案 0 :(得分:1)

您正在定义HTML中与当前路径相关的所有链接。

您需要更改链接,以便:

<a href="about/">about</a> | <a href="contact/">contact</a><br><br>

成为(注意网址上的前导/后缀):

<a href="/about/">about</a> | <a href="/contact/">contact</a><br><br>

当您在页面site.com/about/us上时,浏览器会将<a href="home/"之类的链接解析为site.com/about/us/home

解决方案是更改所有链接,图片,样式表和javascripts,以使用网址中的绝对路径,而不是像现在这样的相对路径。

编辑:刚注意到你的编辑。你真的应该使用绝对路径,而不是相对路径。如果您想保留相对网址,则必须在所有网页上使用<base href="/" />之类的内容。

答案 1 :(得分:1)

无论您做什么,点击<a href="about/">about</a>都会将about/附加到网址的末尾。这就是相对链接的工作方式。

你的选择是按照明智的顺序:

  1. 只需删除该斜杠即可。这就是问题的原因:

    <a href="about">about</a>
    

    相对链接将使用您的新值替换路径的最后一部分(在最后一个/之后)。

  2. 添加前一个../。这有点hacky,但它可以让你保留那个有价值的尾随斜杠

    <a href="../about/">about</a>
    
  3. 执行从/about/about/about的301重定向。这会导致地址栏从/about更改为/about/about并再次返回。

答案 2 :(得分:1)

回答可能有点太晚了,但在<base href="/"> or <base href="your-domain-name"> 部分添加这一行就可以解决问题了:

*