获取当前URL/URI但不包括一些$_GET变量

47

如何在 Yii 中获取当前页面的 URL。例如:

http://www.yoursite.com/your_yii_application/?lg=pl&id=15

但不包括$GET_['lg'](不需要手动解析字符串)?

我的意思是,我正在寻找类似于Yii::app()->requestUrl / Chtml::link()方法的东西,用于返回减去一些$_GET变量的URL。

编辑:当前解决方案:

unset $_GET['lg'];

echo Yii::app()->createUrl(
  Yii::app()->controller->getId().'/'.Yii::app()->controller->getAction()->getId() , 
  $_GET 
);

可能是重复的问题:如何删除查询字符串并获取仅 URL? - T.Todua
https://dev59.com/DGoy5IYBdhLWcg3wo_ro - Sarkhan
17个回答

80

Yii 1

Yii::app()->request->url

对于Yii2:

Yii::$app->request->url

这应该是正确的答案,因为提问者想要完成Yii。 - GusDeCooL
3
这不是海报所要求的内容。请参见下面的答案:https://dev59.com/DGoy5IYBdhLWcg3wo_ro#22460712 - marcovtwout
3
这个答案是错误的。用户需要排除一些GET参数。 - Michael Butler
这个答案有很多赞,但是它是误导性的。@MichaelButler的答案非常好,但你可以看到更短的yii2特定答案:https://dev59.com/DGoy5IYBdhLWcg3wo_ro#33409343 - Vladimir
4
Yii2:Yii::$app->request->url这句代码的意思是获取当前请求的URL地址。其中,Yii2是一个PHP框架,Yii::$app表示应用程序实例,request表示请求对象,而url则是请求对象中获取URL地址的方法。 - Sukma Saputra

32
Yii::app()->createAbsoluteUrl(Yii::app()->request->url)

这将以以下格式输出:

http://www.yoursite.com/your_yii_application/

这应该是正确的答案,有时URL不仅包括控制器和操作,还包括视图,并且取决于路由方法。 - Mahomedalid
1
我认为这是错误的。因为 createAbsoluteUrl 期望一个路由而不是一个 URL。作者的原始解决方案是完全正确的,但更正确的方法是:$this->createUrl($this->getRoute(), $_GET) 并在调用之前,从 $_GET 中取消您不需要的参数。 - Alexandru Trandafir Catalin
这是一个糟糕的答案,不要使用它!当您的URL与路由不匹配时,它会给您带来一堆错误。例如,如果/news/index应该显示News模型的news/view路由,其slug为index。使用此答案,您将获得不正确的URL-它将重定向您到/news/index路由的URL,而不是/news/view - rob006

23

Yii 1

大多数其他答案都是错误的。发帖人正在询问不带(某些)$_GET参数的URL。

这里是一个完整的分解(创建当前活动控制器的URL,无论是否有模块):

// without $_GET-parameters
Yii::app()->controller->createUrl(Yii::app()->controller->action->id);

// with $_GET-parameters, HAVING ONLY supplied keys
Yii::app()->controller->createUrl(Yii::app()->controller->action->id,
    array_intersect_key($_GET, array_flip(['id']))); // include 'id'

// with all $_GET-parameters, EXCEPT supplied keys
Yii::app()->controller->createUrl(Yii::app()->controller->action->id,
    array_diff_key($_GET, array_flip(['lg']))); // exclude 'lg'

// with ALL $_GET-parameters (as mensioned in other answers)
Yii::app()->controller->createUrl(Yii::app()->controller->action->id, $_GET);
Yii::app()->request->url;

当您没有相同的活动控制器时,您必须像这样指定完整路径:

Yii::app()->createUrl('/controller/action');
Yii::app()->createUrl('/module/controller/action');

查看Yii构建URL的指南:http://www.yiiframework.com/doc/guide/1.1/en/topics.url#creating-urls


是的,非常好的答案!(也是唯一正确的答案)不过也可以更新一下适用于Yii2的内容。 - Flion
4
这是关于 Yii2 框架的代码片段:Yii::$app->urlManager->createUrl(array_merge([Yii::$app->requestedRoute], $getParams));该代码用于创建 URL 地址,并将当前请求路由和 GET 参数合并到地址中。 - Flion

15

为了获取绝对的当前请求URL(与地址栏中完全相同,包括GET参数和http://),我发现以下方法效果良好:

Yii::app()->request->hostInfo . Yii::app()->request->url

12

6
你肯定正在搜索这个
Yii::app()->request->pathInfo

4
这个是正确的答案。但对于Yii2来说,应该写成Yii::$app->request->pathInfo - RN Kushwaha

6

我不知道Yii中是否可以这样做,但你可以尝试使用下面的代码,在任何地方都应该可以正常使用(该代码基本上是从我在这里的回答中提取的):

// Get HTTP/HTTPS (the possible values for this vary from server to server)
$myUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && !in_array(strtolower($_SERVER['HTTPS']),array('off','no'))) ? 'https' : 'http';
// Get domain portion
$myUrl .= '://'.$_SERVER['HTTP_HOST'];
// Get path to script
$myUrl .= $_SERVER['REQUEST_URI'];
// Add path info, if any
if (!empty($_SERVER['PATH_INFO'])) $myUrl .= $_SERVER['PATH_INFO'];

$get = $_GET; // Create a copy of $_GET
unset($get['lg']); // Unset whatever you don't want
if (count($get)) { // Only add a query string if there's anything left
  $myUrl .= '?'.http_build_query($get);
}

echo $myUrl;

或者,您可以将Yii方法的结果传递给parse_url()之一,并操纵结果以重新构建所需内容。


这真的很有帮助。我的唯一考虑是Yii使用“正常”(?var=value)格式或PATH(/var/value),它们在配置文件中切换。这就是为什么Yii中的链接使用Chtml :: link()构建,其中包含$ _GET变量数组。 - Sebastian
哦!所以我可以……将整个 $_GET 数组作为输入参数,删除一个值后再传入 :). [离开一分钟尝试一下]。 - Sebastian
@Sebastian 这个可以很容易地重新设计成使用/var/value格式 - 具体如何完成取决于情况,但实际上你只是从输入数据中重新格式化字符串,所以并不难。你可以像这样做:foreach ($get as $key => val) $myUrl .= "/$key/$val";(根据你的URL格式可能需要稍作修改)。 - DaveRandom
使用"/$key/$val"的优雅技巧!另一个解决方案:Yii::app()->createUrl(Yii::app()->controller->getId().'/'.Yii::app()->controller->getAction()->getId(), $_GET );似乎可以工作(在取消设置$_GET['lg']后 :)! - Sebastian
不需要编写Yii已经提供的代码。请阅读此文档:http://www.yiiframework.com/doc/api/1.1/CHttpRequest - marcovtwout

5
因此,您可以使用 < / p>。
Yii::app()->getBaseUrl(true)

获取绝对的网站根目录URL,并去掉http[s]://。

1
$validar= Yii::app()->request->getParam('id');

1

如果在控制器中运行,类似这样的代码应该可以工作:

$controller = $this;
$path = '/path/to/app/' 
  . $controller->module->getId() // only necessary if you're using modules
  . '/' . $controller->getId() 
  . '/' . $controller->getAction()->getId()
. '/';

这假定您在应用程序配置中使用了“友好”的URL。


依赖于特定的URL风格是不好且不必要的。请参阅有关通用URL创建的主题:yiiframework.com/doc/guide/1.1/en/topics.url#creating-urls - marcovtwout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接