2015-02-03 2 views
2

Я пытаюсь реализовать провайдера oembed с использованием платформы Silverstripe, но столкнулся с проблемой.Использование параметра запроса url с контроллером

У меня есть контроллер, маршрутизируемый с 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, но это кажется немного взломанным.

Любые предложения?

Приветствия

+0

Какой контроллер вы используете? 'PageController'? 'ContentController'? Они берут параметр '$ _GET ['url']' в свой 'init()' метод. Почему бы просто не просто расширить «Контроллер» напрямую? – wmk

+0

Привет, я распространяю 'Controller' напрямую, а также

 --- Name: VideoEmbedRoutes After: framework/routes#coreroutes --- Director: rules: 'oembed.json//$Action': 'VideoEmbedController' 
В моем yml-файле.Проблема заключается в том, что '/ framework/main.php' просматривает параметр' $ _GET ['url'] 'и передает его' Director :: direct() ' – CJSewell

ответ

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 немного легче в будущем
  • Выполняет минимальное количество кода, необходимого для «обманывания» Silverstripe, считая, что он работает нормально.

Единственный очевидный недостаток любого решения для смены формы параметра строки запроса url - это если что-то напрямую смотрит на параметр. Как работает Silverstripe, более вероятно, что код использует глобальную переменную $url или Director class вместо того, чтобы смотреть на строку запроса для текущего URL-адреса.

Я испытал это на 3,1 месте, делая изменения я уже упоминал и:

  • Создание контроллера под названием TestController
  • В init функции контроллера, я бегу следующее:

    var_dump($_GET['url']); 
    var_dump($this->getRequest()->getVars()); 
    
  • Прочитано /TestController?url=abc123, увидел, что значение обоих дампов имеет значение «abc123» в качестве значения параметра URL.
  • , переключение на несколько других пользовательских страниц на сайте, чтобы убедиться, что они не были до сих пор работает (нет проблем, которые я видел)

К сожалению, я не смог найти документацию для заказа включения в отношении _config.php и _ss_environment.php. Однако, после просмотра через код, я выработал это так:

я мог бы пойти на но я думаю, это дает довольно хорошую картину того, что происходит. Я не вижу способа избежать использования файла _ss_environment.php. Ничто другое не включается достаточно рано, чтобы вы могли подключиться без изменения кода ядра.

+0

Я думаю, что до сих пор это самый чистый вариант. Я надеялся включить это в модуль, однако его нельзя просто установить с композитором, так как вам нужно создать/изменить '_ss_environment.php' и' .htaccess'. Это можно задокументировать в модулях readme, но было бы здорово обойти это. Спасибо – CJSewell

+0

Есть ли документация о заказе включения? Что-то вроде 'mysite/_config.php', затем' _ss_enviroment.php', а затем '* \ _ config.php'? В принципе, могут ли изменения '_ss_enviroment.php' входить в' mymodules \ _config.php'? – CJSewell

+0

Не нашли никакой документации, но у меня был быстрый просмотр кода, и это '_ss_environment.php' сначала, чем' */_ config.php'. Я уточню свой ответ, чтобы объяснить, что для этого происходит. – Turnerj

1

Я имел быстрый играть с этим в другой день. И глядя на то, что main.php делает это может Лучше всего взломать на нем, а не ErrorPage_controller.

Для startes файла SS по умолчанию .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 изменения, что-то другое, а затем изменить использование main.php «S, а также может/должно помочь или вызовет кучу дополнительных ошибок и печаль.

Чтобы избежать взлома ядра/фреймворка, вы можете изменить .htaccess, чтобы направить копию main.php в mysite (с соответствующими изменениями включения).

+0

Хорошая точка, может быть, что-то вроде ' RewriteRule. * Mysite /main.php?url=%1&%{QUERY_STRING} [L] ' Где' mysite/main.php' проверяет, является ли параметр URL одним из моих, если это так, обрабатывайте его, другие мудрые просто включают 'framework/main.php' Вы проверите это и сообщите, ура. – CJSewell

+0

Я бы рекомендовал изменить 'RewriteRule. * Mysite/main.php? Url =% 1 &% {QUERY_STRING} [L]' на что-то вроде 'RewriteRule. * Mysite/main.php? Apacheurl =% 1 &% {QUERY_STRING} [ L] 'Тогда вам не нужно проверять URL. Я не могу гарантировать, что это не вызовет фанки, но должно дать вам наименее искаженный URL-адрес для работы. – Stephen

Смежные вопросы