Skip to content

Instantly share code, notes, and snippets.

@keltstr
Last active April 27, 2016 13:21
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save keltstr/7515215 to your computer and use it in GitHub Desktop.
Save keltstr/7515215 to your computer and use it in GitHub Desktop.
File:: protected/components/UrlManager.php::RUSSIAN DESCRIPTION::Расширяет возможности базового класса CUrlManager.Делается проверка запроса Url на обращение к нему по его дубликату с использованием имени файла входного скрипта(обычно index.php).При выявлении дубликата Url делается редирект на оригинальный Url ЛИБО отдает ошибку HTTP 404 (в зави…
<?php
class UrlManager extends CUrlManager{
/**File:: protected/components/UrlManager.php (Yii v1.1.14 compatible . May be less...)
::RUSSIAN DESCRIPTION::
В Yii наши URL по-умолчанию выглядят так http://site.com/index.php?param1=a или http://site.com/index.php/param1/a, но обычно мы хотим избавится от имени входного скрипта(index.php) в URL.
И для этого устанавливаем в настройках параметр 'URLManager'=>array(...,'showScriptName' => false,...), но этот способ работает только для формирования и приема URL(http://site.com/param1/a).
Но по-прежнему позволяет обращаться к нашему адресу по его старому значению http://site.com/index.php/param1/a .
ЭТОТ СКРИПТ закрывает эту маленькую огрешность - т.е. не разрешает обращаться к URL в котором по-прежнему присутствует имя входного скрипта после site.com
Расширяет возможности базового класса CUrlManager.
Делается проверка запроса Url на обращение к нему по его дубликату с использованием имени файла входного скрипта(обычно index.php).
При выявлении дубликата Url делается редирект(HTTP 301) на оригинальный Url ЛИБО отдает ошибку HTTP 404 (в зависимости от указанных настроек).
::ENGLISH DESCRIPTION::
In Yii our URL default looks like http://site.com/index.php?param1=a or http://site.com/index.php/param1/a, but usually we want to get rid of the entry script (index.php) in the URL.
For this we setting parameter 'URLManager' => array (..., 'showScriptName' => false, ...), but this method works only for the generation and reception of URL (http://site.com/param1/a).
But as before, gives you access to our address at his old value http://site.com/index.php/param1/a .
THIS SCRIPT closes this little bug - does not refer to the URL which is still present the entry script name after the site.com
Extends the base class CUrlManager
A check request Url to access it by using a duplicate Url with the FILENAME entry script (usually index.php)
In identifying duplicate Url does a redirect(HTTP 301) to the original Url OR gives an HTTP 404 (depending on the settings specified)
::DEUTSCH BESCHREIBUNG::
In Yii unsere URL standardmaBig aussieht http://site.com/index.php?param1=a oder http://site.com/index.php/param1/a, aber in der Regel wollen wir der Eintrag Skript loswerden Name (index.php) in der URL.
Dazu werden wir Parametereinstellung "urlManager '=> array (...,' showscript '=> false, ...), aber diese Methode funktioniert nur fur die Erzeugung und den Empfang von URL (http://site.com / param1 / a).
Aber nach wie vor haben Sie Zugriff auf alte Adresse http://site.com/index.php/param1/a.
DIESES SKRIPT schlieBt diese kleinen Fehler - also nicht zu, URL zuzugreifen, wobei immer noch nach site.com prasentieren den Eintrag Skriptnamen
Erweitert die Basisklasse CURLManager .
Eine Uberprufung Anfrage URL , es mit Hilfe seiner doppelten Dateinamen -Eingabe Skript (meist index.php) zugreifen.
Bei der Identifizierung duplizieren URL macht eine Umleitung (HTTP 301) auf die ursprungliche URL oder geben HTTP- Fehler 404 (je nach den festgelegten Einstellungen ) .
* *
* Parses the user request.
* @param CHttpRequest $request the request application component
*/
/* //в КОНФИГУРАЦИИ ОБЯЗАТЕЛЬНО НЕОБХОДИМО УКАЗАТЬ ЛИШЬ путь к данному классу, а остальные значения переменных можно исправить прямо в этом файле,
* но для большей гибкости, основные настройки вынесены в файл конфигурации main.php в секцию 'components'=>array('urlManager'=>array(...СЮДА...))
* //В файл конфигурации main.php добавить настройки (основные параметры: 'class','showScriptName','actAddressedDoubleUrl','scriptNameEntry')
*
'components'=>array(
.........
'urlManager'=>array(
'class' => 'application.components.UrlManager',//указываем наш новый класс
'urlFormat'=>'path',
'showScriptName'=>false,
'urlSuffix'=>'.php',//добавил расширение .php как и у входного скрипта для проверки ситуаций когда действие выглядит как имя входного скрипта index.php
'useStrictParsing'=>true,//не пропускает те Url у которых нету 'urlSuffix'
'actAddressedDoubleUrl'=>'301',//default:'301'; alternate: '404' - действие необходимое при обращении к странице по дубликату ее URL с использованием имени входного скрипта(обычно index.php)
//'scriptNameEntry'=>'hidden-index.php',//default:'index.php';имя файла входного скрипта(точки входа) - УКАЗАТЬ если отличается от index.php
'caseSensitive'=>false,
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
.........
*
*/
/**
* @var string Default:'301'; alternate: '404' - Выбор действия необходимого при обращении к странице по дубликату её URL с использованием имени входного скрипта (обычно index.php)
*/
public $actAddressedDoubleUrl='301';
/**
* @var string Default:'index.php';Имя файла входного скрипта(точки входа)
*/
public $scriptNameEntry='index.php';
//addressedDoubleUrl() - проверяет является ли URL дубликатом и исправляет ситуацию в зависимости от настроект в main.php
public function addressedDoubleUrl($request)
{
if (Yii::app()->urlManager->showScriptName === false && preg_match('~^/'.preg_quote($this->scriptNameEntry).'(.*)~i', $request->requestUri, $matches))
{
if ($this->actAddressedDoubleUrl=='301') {
if (empty($matches[1])) {$matches[1]='/';}
Yii::app()->request->redirect($matches[1], true, 301);
} elseif ($this->actAddressedDoubleUrl=='404'){
throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',array('{route}'=>$request->requestUri)));
}
return false;
}
return true;
}//function addressedDoubleUrl()
//parseUrl() - функция родителя. Перед ее выполнением добавляется проверка с помощью функции addressedDoubleUrl()
public function parseUrl($request)
{
if($request->requestUri==='/') {Yii::app()->urlmanager->useStrictParsing = false;}//отключает обязательное использование суффикса, если используется "пустое"(''=>'site/index) правило в urlManager [Фикс Yii бага]
if ($this->addressedDoubleUrl($request))
{
return parent::parseUrl($request);
}
}//function parseUrl()
}//class UrlManager
@jehkinen
Copy link

круто написано, очень помогло! спасибо! *можно немного доофомить код и выложить на сайт с рецептами

@keltstr
Copy link
Author

keltstr commented Nov 3, 2014

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

@bysobi
Copy link

bysobi commented Jul 18, 2015

Как быть в новых версиях yii2?)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment