将url查询参数与控制器一起使用

时间:2015-02-03 23:46:08

标签: php silverstripe oembed

我正在尝试使用Silverstripe框架实现oembed提供程序,但遇到了一个问题。

我有一个从url /omebed.json路由的控制器,如果我调用类似/omebed.json?mediaurl=mymovie.mp4的话,它可以正常工作。
然而,Oembed标准规定它应该是/omebed.json?url=mymovie.mp4

但Silverstripe在内部检查$ _GET ['url']变量并尝试路由到该页面/控制器。 所以SilverStripe试图路由到/mymovie.mp4跳过我的控制器并点击ErrorPage_Controller创建一个404.

我想我将不得不扩展ErrorPage_Controller,如果url是oembed.json则重新调整它,但这似乎有点hackish。

有什么建议吗?

干杯

2 个答案:

答案 0 :(得分:3)

根据@ Stephen的回答,这是一种解决该问题的方法,无需重复main.php而无需直接修改。

我所做的是创建一个_ss_environment.php file,它在Silverstripe的加载过程中尽早添加。

<强> _ss_environment.php

global $url;
$url = $_GET['raw_url'];
if (isset($_GET['url']))
{
    unset($_GET['url']);
}

// IIS includes get variables in url
$i = strpos($url, '?');
if($i !== false)
{
    $url = substr($url, 0, $i);
}

<强>的.htaccess

RewriteCond %{REQUEST_URI} ^(.*)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.php$
RewriteRule .* framework/main.php?raw_url=%1 [QSA]

所以这就是发生的事情:

  • .htaccess现在使用raw_url而不是url
  • _ss_environment.php在加载过程的早期被调用,设置global $url variable that main.php normally sets。这是使用raw_url而非url
  • 设置的
  • 为了防止main.php在看到url查询字符串参数时再次覆盖它,它会被取消(Silverstripe似乎会在我的测试中稍后重置它)。
  • 最后是main.php would normally run if $_GET['url'] is set的一小段代码,在IIS中明显支持原样复制。 (如果你不使用IIS,你可能不会需要它。)

这有一些好处:

  • main.php无法更新,以便将来稍微更新Silverstripe
  • 运行所需的最少量代码&#34;技巧&#34; Silverstripe认为它正常运行。

任何改变url查询字符串参数的解决方案的一个明显缺点是,如果有任何东西直接查看参数。根据Silverstripe的工作原理,代码更有可能使用$url全局变量或Director class,而不是查看当前URL的查询字符串。

我在3.1网站上通过我提到的更改进行了测试:

  • 创建名为TestController
  • 的控制器
  • 在控制器的init功能中,我运行以下命令:

    var_dump($_GET['url']);
    var_dump($this->getRequest()->getVars());
    
  • 访问/TestController?url=abc123,看到两个转储的值都有&#34; abc123&#34;作为URL参数的值。
  • 导航到网站上的其他几个自定义页面,以确保它们仍在工作(没有我看过的问题)

很遗憾,我无法找到有关_config.php_ss_environment.php的包含顺序的文档。但是,在浏览完代码之后,我已经解决了这个问题:

我可能会继续,但我认为这可以很好地描述正在发生的事情。我没有真正看到不使用{{1}}文件的方法。在没有修改核心代码的情况下,您可以尽早获得其他任何内容。

答案 1 :(得分:1)

前几天我快速玩了一下。并查看main.php

首先,SS的默认ErrorPage_controller文件执行此操作:

.htaccess

请注意<IfModule mod_rewrite.c> SetEnv HTTP_MOD_REWRITE On RewriteEngine On # RewriteBase /silverstripe RewriteCond %{REQUEST_URI} ^(.*)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* framework/main.php?url=%1&%{QUERY_STRING} [L] </IfModule> 将其更改为其他内容,然后更改?url的使用情况也可能/应该有所帮助,或者会导致一堆额外的错误和悲伤。

为了避免攻击核心/框架,您可以更改.htaccess以在main.php中定位main.php的副本(具有适当的包含更改)。