0

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

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

.htaccess

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

索引.php

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

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

谢谢您的帮助!

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

编辑2:添加

RewriteBase /

断开链接。他们似乎要去 domain.com/about/ 和 .../contact/,但我得到一个 404 - 我假设我使用的规则与我进行链接的方式不兼容,这就是为什么我也包括了 index.php。

4

3 回答 3

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.

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

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

于 2012-10-23T19:46:12.430 回答
1

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

您的选择是,按照明智的顺序:

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

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

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

  2. 添加前面的../. 这有点hacky,但它可以让你保留有价值的斜线

    <a href="../about/">about</a>
    
  3. /about/about从to执行 301 重定向/about。这将导致地址栏/about再次/about/about来回切换。

于 2012-10-23T19:47:21.063 回答
1

回答可能有点晚了,但是在本<head>节中添加这一行就可以了:

<base href="/"> or <base href="your-domain-name">
于 2016-07-01T12:29:49.873 回答