我正在尝试使用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。
有什么建议吗?
干杯
答案 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 任何改变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
的包含顺序的文档。但是,在浏览完代码之后,我已经解决了这个问题:
main.php
runs, first main task is to require core/Constants.php
Constants.php
's first task is to search for _ss_environment.php
in the base folder and potential parent folders.如果找到,则会包含它。main.php
(<{>> $_GET['url']
检查完成后main.php
),它将会ErrorControlChain
开始_ss_environment.php
{{1}} 3}} core/Core.php
Core.php
, it performs calls for the config manifest 我可能会继续,但我认为这可以很好地描述正在发生的事情。我没有真正看到不使用{{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的副本(具有适当的包含更改)。