【问题标题】:Hide GET parameter from URL从 URL 隐藏 GET 参数
【发布时间】:2014-08-02 18:32:41
【问题描述】:

如何隐藏 URL GET 参数 (http://domain.com/MyFirstYii/page?view=about)。我搜索了很多帖子。他们都在说重写和 URL 管理器,但我无法实现我想要的。 :(

我的情况是,

我只是想隐藏 URL GET 参数。

例如:

http://domain.com/MyFirstYii/page***?view=about***

我想隐藏***?view=about***

那么 URL 应该看起来像这样http://domain.com/MyFirstYii/page。像这样的其他页面http://domain.com/MyFirstYii/post。简而言之,我的 GET 参数应该像 POST 参数一样。

提前致谢。

编辑:

我想在URLManager中创建一些规则,但是什么样的规则会隐藏GET参数。

【问题讨论】:

  • 只使用POST而不是GET有什么问题?
  • 这没有任何意义。 URL 是 URL; HTTP 请求中不包含其他用户控制的数据。考虑使用 URL 重写。
  • 我也想在“href”中使用。我不能在那里使用 POST 吗?
  • 您要么重写浏览器的工作方式,在加载页面并处理 GET 参数后重新加载不带 get 参数的页面,要么发布数据。根据定义,GET 数据作为请求的一部分在 url 中传递
  • 就像其他用户暗示的那样,GET 参数的全部意义在于它们位于 URL 本身中。您需要使用 POST,或者通过尝试隐藏 GET 参数来告诉我们您要解决的问题。

标签: php url-rewriting yii


【解决方案1】:
正则表达式中的

\w 表示“单词”字符,并且诸如“my-prety-page”之类的 url 部分将不匹配。 要隐藏 GET 参数,您必须改进 urlManager 规则。您可以使用 SEF url 为页面编写这样的规则:

'<controller:\w+>/<id:\d+>/<title:[^\/]*>/*' => '<controller>/view'

这种情况下当你输入url时

http://example.com/page/12/my-prety-title

页面控制器将被调用以执行视图操作,其中 id 和 title 作为参数。输入这个url也是一样的:

http://example.com/page/view?id=12&title=my-prety-title

规则中的最后一部分/* 允许保留额外的参数。例如。如果你的地址是

http://example.com/user/55/john-doe-junior/foo/bar/

UserControlleractionView你可以写

echo '<pre>' ;
print_r($_GET);
echo '</pre>' ;
die();

你会看到

Array
(
    [id] => 55
    [title] => john-doe-junior
    [foo] => bar
)

【讨论】:

    【解决方案2】:

    从 main.php 中取消注释这些行

    'urlManager'=>数组( 'urlFormat'=>'路径', 'showScriptName'=>假, '规则'=>数组( 'MyFirstYii/post/'=>'MyFirstYii/post', '/'=>'/view', '//'=>'/', '/'=>'/', ), ),

    并将.htaccess文件放在项目根目录下,编写如下代码

    重写引擎开启 # 如果目录或文件存在,直接使用 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 否则转发到 index.php 重写规则。索引.php

    【讨论】:

    • 这些都是基本的重写选项,我已经取消了这些东西的注释。甚至它显示了“站点/页面?view=about”网址
    • 这只改变了url格式并隐藏了index.php参数
    • 是的,我也想隐藏'?view=about'。 :(
    • 你不能从 url 中隐藏所有参数,你可以从 url 中隐藏 "?view="。
    • @abhi : 如何隐藏 "?view="?
    【解决方案3】:

    将此网址规则添加到您的网址规则的顶部:

    'page/<view:\w>' => 'user/page'
    

    我假设下一个:

    • 控制器名称:UserController
    • 动作名称:actionPage

    如果我的假设有误,请提供正确的控制器名称和动作名称,以便我修正答案。

    更新: 基于评论的固定控制器名称

    更新2:

    如果您希望它适用于控制器中的所有操作,请使用:

    '<action:\w>/<view:\w>' => 'user/<action>'
    

    【讨论】:

    • 我的控制器是'UserController',动作名称是'page'
    • 也为你改变了 :)
    • 还添加了第二个规则,您可以根据需要使用它来代替第一个规则。让我知道它是如何工作的,因为我无法在这里测试它。
    【解决方案4】:

    如果您打算使用 GET 并需要这些参数,则不能隐藏它,因为这是 GET 的工作方式。如果你真的需要隐藏参数,你必须切换到 POST,因为这样参数将在请求负载中而不是在 url 中传递。

    【讨论】:

    • 他说他正在动态地将 url 放置在锚标签中。这里没有 post 方法和 get 方法有效
    【解决方案5】:

    使用 post 方法而不是 get....这是最好和有效的解决方案。

    要跟进您的查询,请查看此网站:

    [http://pure-essence.net/2007/06/29/simple-php-path-rewrite/]

    【讨论】:

    • 使用GET 方法比POST 快。因此,POST 不是一个有效的解决方案。 POST的主要优点是可以在传输时隐藏敏感信息,可以帮助传输大量数据。
    • 老兄,请停下。这里没有什么要发布的……我不敢相信每个人都在谈论使用 POST 而不是 GET。它没有任何意义!
    • @MrSoundless OP的问题首先(编辑前)是关于HIDING THE URL。 (见编辑历史stackoverflow.com/posts/17086732/revisions)。好吧,你现在应该明白了!
    • @KevinPaladin 甚至在编辑之前,他想要什么就很明显了。
    • 我不是来这里开始争论的,但在 SO 中,问题应该得到很好的解释和明确,但事实并非如此。建议不同解决方案的答案不值得反对。除了 OP,它也可能对其他人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2021-02-10
    • 2013-08-19
    相关资源
    最近更新 更多