【问题标题】:parameter passing by HTTP GET request other than as query parameters- slug/cleanurl/prettyurl由 HTTP GET 请求传递的参数,而不是作为查询参数 - slug/cleanurl/prettyurl
【发布时间】:2016-02-07 20:18:56
【问题描述】:

注意:这里使用的URL,代码仅用于我的示例的演示目的。

我已经看到,对于 HTTP GET 请求,如果您想传递一个值以进行决策,出于某些充分的原因,它不会通过查询字符串参数传递。

假设有一个缩略图显示位于houston 位置的书店,例如“ABC Bookstore” 该图像的href 属性假定如下

domain.com/texas/abcbookstore-houston

这是需要的,页面显示书店详细信息,而不是 URL 显示为domain.com/texas/details.php?id=1

问题:

知道如何分析 URL 以获取密钥吗?当我查看 Chrome 的网络选项卡时,一个网站显示

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

我的想法:

解析完整的URL后可以提取最后一个单词,得到'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”的列,并且查询将获取与“nameofid”匹配的“id”。 nameofid 在这种情况下是“abcbookstore-houston”。

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

【问题讨论】:

  • 我投票结束这个问题作为题外话,因为它询问工作代码是否是正确的方法,这是一个code review 问题。
  • 您非常困惑pretty url 需要带有查询字符串参数的服务器路由配置。他们基本上都做同样的事情
  • 简短的回答是 htaccess 将被设置为将没有匹配目录或文件的任何内容发送到 index.php,然后需要根据 url 段管理发生的事情。跨度>
  • @Quentin meta.stackexchange.com/questions/204124/… 当您标记它时,请您选择“其他”选项,以便您可以指定您认为应该将问题迁移到哪个其他站点以及您认为它的原因非常适合该网站。感谢您提及代码审查网站。不知道这个
  • @charlietfl 你给了我一个非常有用的信息.. “漂亮的 url 需要带有查询字符串参数的服务器路由配置”.. 甚至我注意到一些链接实际上有查询字符串参数,而且被分析以将用户重定向到这个漂亮的 url,并分析漂亮的 url 以加载页面详细信息..将从您的评论中检查更多内容

标签: php .htaccess http-get


【解决方案1】:

正如 @charlietfl 提到的,我实际上是在查看 Clean URLs 也称为 Pretty URLs

这是实际的书店详情页面

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'是强制而不是可选

所以这里实际发生的是,当我搜索此 URL 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 内部,我们可以使用$_GET["id"] 获取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 参数传递。

注意:

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

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

为了方便用户键入 URL,通常会使用特殊字符 删除或更换为好。例如,重音字符是 通常用英文字母代替;标点 标记通常被去除;和空格(必须编码为 %20 或 +) 替换为破折号 (-) 或下划线 (_),它们是 更美观。

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 2012-08-28
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2020-10-20
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多