![](/img/trans.png)
[英]How to get additional $_GET Parameters in Yii2 when prettyurl is enabled?
[英]parameter passing by HTTP GET request other than as query parameters- slug/cleanurl/prettyurl
注意:此处使用的URL和代码仅用于示例说明。
我已经看到,对于HTTP GET
请求,如果您想传递一个用于决策的值,出于某些原因,它不会通过查询String参数传递。
假设在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看起来很干净。
如@charlietfl所述,我实际上是在查看Clean URL(也称为Pretty URL)
这是实际的书店详细信息页面
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或+)替换为破折号(-)或下划线(_),从美学上讲更令人愉悦。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.