【问题标题】:Permalink, .htaccess pretty urls固定链接,.htaccess 漂亮的网址
【发布时间】:2018-07-23 18:22:47
【问题描述】:

如果我打扰了你们,我真的很抱歉,但这是我关于 .htaccess 技巧的最后一个问题

我需要 wordpress 样式,“漂亮的永久链接”

但这对我来说太混乱了。

我需要,这个网址http://test.com/?page=test&ID=1http://test.com/test/NAMEFROMDATABASE

怎么样?我知道如何使用$_GET['ID'] 获取ID=1,但是如何将数据库中的值放入url 并读取?

【问题讨论】:

  • 为什么不这样做http://test.com/test/1/NAMEFROMDATABASE,所以你的 url 中有 ID,就像 SO 有它们​​一样。这将帮助您做两件事: 1. 如果需要,将使 URL 更短。 2. 将使特定记录的查找变得容易且快速
  • 我目前正在这样做:test.com/djs?djID=1 原始网址是 test.com?page=djs&djID=1 但它不是 SEO 友好的,它会导致多个结果相同的 dj 页面,另外我希望用户输入 dj 的名称,而不是随机数,然后是 dj 名称。
  • 您可以轻松地将该 URL 更改为 test.com/djs/1
  • 我知道,但这对我没有用,我想要 test.com/djs/djname,因为它的 seo 友好且易于用户和其他人记住。
  • 但是从正确制作的数据库表中查找短页面名称...使用一些智慧的人...然后你问。

标签: php mysql .htaccess mod-rewrite permalinks


【解决方案1】:

您无法通过 $_GET['ID'] 直接从该 URL 获取 ID 值:http://test.com/test/NAMEFROMDATABASE

您可以按照以下逻辑获取ID。

  1. 按类别名称创建链接。即,如果您有笔记本电脑类别,则创建http://test.com/category/CATNAME

  2. 之类的链接
  3. 在htaccess中写重写代码。RewriteRule ^category/(.*)$ categories\.php?CNAME=$2&%{QUERY_STRING} [L]

  4. 在 PHP 代码中从类别名称中获取类别 ID。$catName=$_GET['CNAME']

  1. 按类别名称和类别 ID 创建链接。即,如果您有笔记本电脑类别,则创建类似 http://test.com/category/CATNAME-ID-CATID 的链接
  2. 在 htaccess 中编写重写代码。 RewriteRule ^category/(.*)-ID-([0-9]+)$ categories\.php?ID=$2&%{QUERY_STRING} [L]
  3. 在 PHP 代码中直接获取类别 ID。 $catID= $_GET['ID']

【讨论】:

  • 对我来说,RewriteRule ^djs/(.*)$ index\.php?page=djs&djID=$1&%{QUERY_STRING} [L] 转换 test.com/index.php?page=djs&djID =username 进入 test.com/djs/username,$_GET['djID'] 返回 'username',没有问题。
  • 非常感谢,只是 2 美元对我不起作用,将其更改为 1 美元就完美了。
【解决方案2】:

怎么样?我知道如何使用 $_GET['ID'] 获取 ID=1,但是如何将数据库中的值放入 url 并读取它?

您可以像这样从数据库中获取值:

$id = mysql_real_escape_string($_GET['id']);
$sql = "SELECT folder, urlname FROM urls WHERE id = '$id' ";
// don't forget to single quote '$id'       ^   ^  or you'll get errors
// and even worse mysql_real_escape_string() will not protect you.
if ($result = mysql_query($sql)) {
  $row = mysql_fetch_row($result);
  $pagename = $row['urlname'];
  $folder = $row['folder'];
}

如果你知道id 是一个整数,你也可以使用$id = intval($_GET['id']);
我建议始终使用mysql_real_escape_string(),因为它适用于所有值,而intval 仅适用于整数。
在 SQL 中,引用数字从来都不是问题,因此请养成始终引用所有内容的习惯。
这样你就不会犯错误。

你可以永远这样做

$sql = "SELECT urlname FROM urls WHERE id = '{$_GET['id']}' ";

因为这是一个 SQL 注入安全漏洞。

见:
How does the SQL injection from the "Bobby Tables" XKCD comic work?
http://php.net/manual/en/function.mysql-query.php
http://php.net/manual/en/function.mysql-fetch-row.php
http://php.net/manual/en/function.mysql-connect.php
http://php.net/manual/en/function.mysql-close.php

【讨论】:

  • 谢谢,但也许我不够清楚。我知道如何从 url 中获取一个值并在数据库中查询它。我想要做的是将帖子 ID 转换为 POST 名称,例如 ?id=1 变为 'randomname' 我只希望这是客户端,因此 test/randomname 将是 test/ID=1
【解决方案3】:

您不能在 htaccess 中执行此操作,您需要调整脚本,以便接收 name=xxx 而不是接收 id=1。然后它将在数据库中查找名称并计算 ID

好的,所以在 .htaccess 中你会有这样的东西

RewriteRule ^something/(.+)\.htm$ something/file.php?djname=$1 

在您的 php 脚本中,您将拥有

$name = mysql_real_escape_string($_GET['djname']);

$sql = "SELECT * FROM djtable where name='" . $name . "' LIMIT 1";

OBS: 1. 使用适当的 sql 转义。 2. 确保 dj 名称在数据库中是不同的。

【讨论】:

  • 谢谢,这就是我需要知道的一切。那么您现在能告诉我,如何将 page=test&name=myname 更改为 test/myname。然后我将在数据库中查询?
  • 这不是 SQL!它是 .htaccess,我现在要编写一些代码,但是如何重写 URL,将 test.com?page=x&ID=y 转换为 test.com/x/y
  • @Dan, A:关于逃跑请听从你自己的建议。 B:如果name 是唯一的,则不需要limit 1 C:select * 是反模式,只选择您需要的字段。
  • @Johan 你是对的,但这里不是关于编写好的代码/sql,而是关于 htaccess。我只是把代码描述得更有描述性,避免输入太多,因为他自己的code/sql会不一样。我同意我可以更好地输入而不是添加观察结果:)
猜你喜欢
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2012-01-10
  • 2012-06-05
  • 2012-06-08
  • 2016-06-23
  • 1970-01-01
相关资源
最近更新 更多