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

parameter passing by HTTP GET request other than as query parameters- slug/cleanurl/prettyurl

注意: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 table 中多一个名为“nameofid”的列,查询将获取“id”,其'nameofid' 匹配。 nameofid 在这种情况下是“abcbookstore-houston”。

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

正如 @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= [NC,L,QSA]

最后的命令可以替换为

RewriteRule ^texas/([^/]+)/?$ details.php?id= [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 并继续我们的业务逻辑。


补充说明:

如果 objective 是 http://www.domain.com/abcbookstore-houston 那么 RewriteRule 将是

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

这里有更多关于所用命令的解释

  • RewriteEngine On 启动引擎。

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

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

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

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

注:

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

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

To make the URL easier for users to type, special characters are often removed or replaced as well. For instance, accented characters are usually replaced by letters from the English alphabet; punctuation marks are generally removed; and spaces (which have to be encoded as %20 or +) are replaced by dashes (-) or underscores (_), which are more aesthetically pleasing.