【问题标题】:Next url appending right next to the first url while trying to use url rewriting尝试使用 url 重写时,下一个 url 附加在第一个 url 旁边
【发布时间】:2016-06-19 03:35:57
【问题描述】:

我有这个简单的 .htaccess 文件,我正在尝试从 url 中删除查询字符串。

当前网址:- search.php/page?page=1&s=14.

我要完成 url:- page/1/14.

所以我的 htaccess 文件看起来像这样。

RewriteEngine On
RewriteRule ^page/([0-9]+)/([A-Za-z0-9]+)$ search.php?page=$1&s=$2

我的href看起来像这样

if($i==$page){
    $numbers.='<li><a class="active" href="page/'.$i.'/'.$sterm.'">'.$i.'</a></span></li>';
    }
    else {
        $numbers.='<li><a href="page/'.$i.'/'.$sterm.'">'.$i.'</a></span></li>';
    }

这工作正常,但是当我尝试从第 1 页转到第 2 页时,我的网址如下所示:- page/1/14/page/2/14。为什么会这样?

【问题讨论】:

  • 您确定不只是在链接中的 href 开头缺少“/”,从而使浏览器转到 page2 url 相对于 page1 url?
  • 我已经更新了我的问题。但是如果我在开始时使用“/”分页似乎不起作用
  • 托尼,当您调用您的网址时,它类似于“domain.com/page/1/14”,对吗?如果您手动将数字更改为“domain.com/page/2/14”之类的数字,它仍然可以正常工作吗?在这种情况下,它应该与您的 .htaccess 没有任何关系。
  • @MartinMouritzen 是的。如果我手动更改它,它会起作用。那么我应该如何编写这些链接?

标签: php .htaccess url mod-rewrite


【解决方案1】:

正如 MartinMouritzen 所提到的,如果您有一个不以 / 开头的 href 标签,它将使用当前路径作为基础。在您的情况下,当前路径是page/1/14,因此浏览器决定使用的新路径是page/1/14/page/2/14。为每个 href 属性添加一个前导斜杠应该可以解决此问题。

此外,您应该稍微调整一下 rewriteRule,以便允许尾部斜杠:

RewriteEngine On
RewriteRule ^page/([0-9]+)/([A-Za-z0-9]+)/?$ search.php?page=$1&s=$2

您还应该小心将变量直接写入 HTML,sterm 似乎是用户给定的?如果是这种情况,那肯定是 XSS 漏洞。您真的应该在将所有变量写入页面时对其进行清理,如下所示:

$s_url = '/page/' . htmlspecialchars($i) . '/' . htmlspecialchars($sterm);
if($i == $page) {
    $numbers .= '<li><a class="active" href="' . $s_url . '">' . htmlspecialchars($i) . '</a></span></li>';
} else {
    $numbers .= '<li><a href="' . $s_url . '">' . htmlspecialchars($i) . '</a></span></li>';
}

最后,看起来你有一个闭合跨度,但没有开口跨度?尽管它在技术上是有效的 HTML 来交织标签(又名&lt;b&gt;&lt;i&gt;something&lt;/b&gt;&lt;/i&gt;),但它不是好的形式。您绝对应该在 li 元素中包含打开的 span,或者将关闭的 span 移到 li 元素之外(因此 lispan 标记不会交织在一起,只是嵌套)。

【讨论】:

  • Ben martin 是对的,我忘了选择我的基本文件夹。你发现了一些我没有真正注意到的东西。感谢您的建议。
【解决方案2】:

这个问题与你的重写没有任何关系。

编辑你的代码

if($i==$page){
    $numbers.='<li><a class="active" href="/page/'.$i.'/'.$sterm.'">'.$i.'</a></span></li>';
}
else {
    $numbers.='<li><a href="/page/'.$i.'/'.$sterm.'">'.$i.'</a></span></li>';
}

它会给出预期的结果。

【讨论】:

  • 通过在我的链接之前添加一个“/”,分页将不起作用。因为它从 url 中删除了我的基本文件夹。已经试过了
  • 啊,但是您必须考虑到您的基本文件夹。因此,假设您的基本文件夹是“myfolder”,那么您将使代码类似于 if($i==$page){ $numbers.='
  • '.$i.'
  • '; } else { $numbers.='
  • '.$i.'
  • ';尝试做相对只会让人头疼。您必须将您的 href 设置为类似 "../../../page/".$i."/".$sterm."" 的东西,这不是很容易维护。
  • 不客气。同样正如 Ben 提到的,如果 $sterm 是一个用户变量,请不要在没有先运行 htmlspecialchars() 的情况下输出它。 :)
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签