通过HTTP GET请求传递的参数,而不是查询参数 - slug / cleanurl / prettyurl

时间:2016-02-07 20:18:56

标签: php .htaccess http-get

注意:此处使用的URL,代码仅用于演示我的示例。

我已经看到,对于 HTTP GET 请求,如果您想传递一个值用于决策,那么由于某些原因,它不会通过查询字符串参数传递。

允许'说有一个缩略图显示houston位置的书店,比如" ABC Bookstore" 该图像的href属性假设如下

domain.com/texas/abcbookstore-houston

这就是所需要的,该页面显示了书店的详细信息,相反的网址显示为domain.com/texas/details.php?id=1

问题:

有关如何分析URL以获取密钥的任何想法?当我查看Chrome的“网络”标签时,有一个网站显示

Request Headers
:authority:www.domain.com
:method:GET
:path:/texas/abcbookstore-houston

我的想法:

我可以在解析完整的网址后提取最后一个单词,然后我得到abcbookstore-houston'

我试过的代码:

$url = "domain.com/texas/abcbookstore-houston";
$path = parse_url($url, PHP_URL_PATH);
//echo $path;//// prints "/texas/abcbookstore-houston"

$parts = explode('/', rtrim($path, '/'));
$id_str = array_pop($parts);
echo $id_str; // prints abcbookstore-houston

我的想法是,我们可以在主bookstore表格中再添加一列名为' nameofid'并且查询将获取' id'他们的nameofid'火柴。 在这种情况下,nameofid是" abcbookstore-houston"。

汇总问题:这是正确的做法吗?我已经看到,在许多网站中,即使这是一个GET请求,它们也不再传递查询参数,而是像这个用例一样看起来很干净。

1 个答案:

答案 0 :(得分:2)

正如 @charlietfl 所提到的,我实际上是在查看简洁网址,也称为漂亮网址

这是实际的书店详细信息页面

http://www.domain.com/texas/details.php?id=1

基本上应该是

http://www.domain.com/texas/details.php?id=abcbookstore-houston

我希望它在地址栏中显示为

http://www.domain.com/texas/abcbookstore-houston

最后,我通过在.htaccess文件

中进行以下更改找到解决方案
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:texas/)?([^/]+)/?$ details.php?id=$1 [NC,L,QSA]

最终命令可以替换为

RewriteRule ^texas/([^/]+)/?$ details.php?id=$1 [NC,L,QSA]

如果“texas”是必需而不是可选

所以这里实际发生的是当我搜索此网址http://www.domain.com/texas/abcbookstore-houston时,服务器实际路由到http://www.domain.com/texas/details.php?id=abcbookstore-houston,而我们在地址栏中只看到http://www.domain.com/texas/abcbookstore-houston

因此,在details.php内,我们可以使用id获取$_GET["id"]并继续我们的业务逻辑。

附加说明:

如果目标是http://www.domain.com/abcbookstore-houston 然后RewriteRule将是

RewriteRule ^([^/]+)/?$ details.php?id=$1 [L,QSA]

以下是有关所用命令的更多解释

  • RewriteEngine On启动引擎。

  • 如果请求文件名存在,则
  • RewriteCond %{REQUEST_FILENAME} !-f不会重写任何内容,并且是文件。

  • 如果请求文件名存在,则
  • RewriteCond %{REQUEST_FILENAME} !-d不会重写任何内容,并且是目录。

  • RewriteRule ^([^/]+)/?$ details.php?id=$1 [L,QSA]这是实际的重写规则。它需要在域名之后的任何内容(除正斜杠之外的任何内容),并将其重写为details.php,并将其作为id参数传递。

  • RewriteRule ^texas/([^/]+)/?$ details.php?id=$1 [NC,L,QSA]这是实际的重写规则。在{域名后跟字符串'texas'}(除正斜杠之外的任何内容)之后需要执行任何操作,并将其重写为details.php,并将其作为id参数传递。< / p>

注意:

此用例abcbookstore-houston中使用的单词的技术术语是 slug https://en.wikipedia.org/wiki/Semantic_URL#Slug

slug是URL的一部分,它使用人类可读的关键字标识页面。

  

为了使用户更容易输入网址,通常会使用特殊字符   删除或替换。例如,重音字符是   通常用英文字母表中的字母代替;标点   标记通常被删除;和空格(必须编码为   %20或+)由短划线( - )或下划线(_)代替,它们是   更美观。