Привет, коллеги-разработчики!
Мы почти закончили разработку первой фазы нашего веб-приложения ajax. В нашем приложении мы используем хеш-фрагменты, такие как:
http://ourdomain.com/#!list=last_ads&order=date
Я понимаю, что Google получит этот URL-адрес и сделает запрос на сервер в этой форме:
http://ourdomain.com/?_escaped_fragment_=list=last_ads?order=date&direction=desc
все идеально, кроме …
Я хотел бы перенаправить этот запрос на другой скрипт
вот так:
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ RewriteRule ^$ /webroot/crawler.php$1 [L]
Проблема в том, что когда я пытаюсь print_r ($ _ REQUEST) в crawler.php, я получаю только:
Array ( [_escaped_fragment_] => list=last_ads?order=date [direction] => desc )
я бы хотел получить
Array ( [list] => last_ads [order] => date [directions] => des )
Я знаю, что могу использовать php для дальнейшего разрыва первого аргумента, но я не хочу;)
пожалуйста, порекомендуйте
================================================== == EDIT … некоторые исправления в тексте и логике
Ваша забытая директива QSA (все пропустили точку = D)
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ RewriteRule ^$ /webroot/crawler.php%1 [QSA,L]
Кстати, ваш $1
– это правда … бесполезно, потому что это ничего не значит. Так что это должно быть:
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ RewriteRule ^$ /webroot/crawler.php [QSA,L]
Скажите, если это сработает.
Если я не ошибаюсь.
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ RewriteRule ^$ /webroot/crawler.php?%1 [L]
Возможно, для вас это очевидно, но в документации по поводу экранированных символов: настройте сервер для обработки запросов на URL-адреса, которые содержат
Искатель избегает определенных символов во фрагменте во время преобразования. Чтобы получить исходный фрагмент, обязательно отмените все символы% XX в фрагменте. В частности,% 26 должно стать &,% 20 должно стать пространством,% 23 должно стать #, а% 25 должно стать% и т. Д.
Вот решение, которое обеспечивает маршрутизируемый URL и параметры запроса, правильно установленные для обработки в сценарии на стороне сервера.
Пример. Если вы хотите http://yoursite.com/#!/product/20
стать http://yoursite.com/crawler/product/20
Сначала в .htaccess
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ RewriteRule ^$ /crawler/index.php?_frag=%1 [L]
Нам нужно избавиться от _escaped_fragment_
в URL-адресе и заменить его чем-то другим, например: _frag
чтобы веб-сервер (Apache) не попадал в циклические перезаписи.
Второй в crawler/index.php
<?php if(array_key_exists('_frag', $_REQUEST)) { $_SERVER['REQUEST_URI']=$_REQUEST['_frag']; unset($_REQUEST['_frag']); parse_str($_SERVER['QUERY_STRING'], $frag); parse_str(preg_replace('/^.*\?/', '', $frag['_frag']), $_REQUEST); $_SERVER['QUERY_STRING'] = http_build_query($_REQUEST); } // Continue with your usual script of routing // $_REQUEST now contains the original query parameters
с<?php if(array_key_exists('_frag', $_REQUEST)) { $_SERVER['REQUEST_URI']=$_REQUEST['_frag']; unset($_REQUEST['_frag']); parse_str($_SERVER['QUERY_STRING'], $frag); parse_str(preg_replace('/^.*\?/', '', $frag['_frag']), $_REQUEST); $_SERVER['QUERY_STRING'] = http_build_query($_REQUEST); } // Continue with your usual script of routing // $_REQUEST now contains the original query parameters
В htacess работа в виртуальном хосте не работает, поэтому я добавляю в "каталог"
<Directory "X:/DIR"> RewriteEngine On RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ RewriteRule ^$ /crawler/index.php?_frag=%1 [L] </Directory>