Crawlable AJAX с _escaped_fragment_ в htaccess

Привет, коллеги-разработчики!

Мы почти закончили разработку первой фазы нашего веб-приложения 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>