@adun3

Как поменять request_uri в битриксе?

Нужно реализовать сео урлы.
Раньше я просто подменял в init.php переменную $_SERVER['REQUEST_URI'], теперь это не работает. Как в d7 сделать подмену?
Update.
Все ссылки которые я хочу поменять делаются smart фильтром. Который удаляет все get параметры, т.е. urlrewrite.php просто так не подставить. Неужели придется переписывать смарт фильтр...
  • Вопрос задан
  • 1758 просмотров
Пригласить эксперта
Ответы на вопрос 1
babarun
@babarun Куратор тега 1С-Битрикс
Безумный план моих идей в руках больных людей
Как уже написал xzdshr так делать нельзя, но давайте разберёмся где в d7 это расположено.
Для начала выясним как в d7 вообще можно получить URI:
use Bitrix\Main\Application; 
use Bitrix\Main\Web\Uri; 
$request = Application::getInstance()->getContext()->getRequest(); 
$requestUri= $request->getRequestUri();


Загляним в реализацию этого метода, быть может там рядом есть setRequestUri ?

//    HttpRequest::getRequestUri()
//    /bitrix/modules/main/lib/httprequest.php:226

    public function getRequestUri()
    {
        return $this->server->getRequestUri();
    }


Ага, HttpRequest отнаследован от Request'a
class HttpRequest extends Request

А тот, являясь абстрактным классом, в свою очередь расширяет ParameterDictionary
abstract class Request extends Type\ParameterDictionary


И далее спускаемся к реализации класса Dictionary, где нас будет интересовать метод offsetSet:
/**
	 * Offset to set
	 */
	public function offsetSet($offset, $value)
	{
		if($offset === null)
		{
			$this->values[] = $value;
		}
		else
		{
			$this->values[$offset] = $value;
		}
	}


Коим мы и попытаемся воспользоваться:
<?
use Bitrix\Main\Application;
use Bitrix\Main\Web\Uri;
$request = Application::getInstance()->getContext()->getRequest();
$request->offsetSet("REQUEST_URI", 'abrakadabra.php');

И получим:
[Bitrix\Main\NotSupportedException] 
Can not set readonly value (150)
/home/bitrix/www/bitrix/modules/main/lib/type/parameterdictionary.php:53
#0: Bitrix\Main\Type\ParameterDictionary->offsetSet(string, string)


Потому что в файле parameterdictionary.php в строке 51 есть замечательный метод:
/**
	 * Offset to set
	 */
	public function offsetSet($offset, $value)
	{
		throw new NotSupportedException("Can not set readonly value");
	}


Мораль, если захотите эту несправедливость исправить, то лезть придётся достаточно глубоко.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы