通过 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.
注意: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.