Crawlable AJAX с _escaped_fragment_ в htaccess - PullRequest
6 голосов
/ 09 ноября 2011

Здравствуйте, разработчики!

Мы почти закончили разработку первого этапа нашего веб-приложения 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 для дальнейшего разрыва первого аргумента, но я не хочу;)

пожалуйста, сообщите

=================================================== РЕДАКТИРОВАТЬ ... некоторые исправления в тексте и логике

Ответы [ 5 ]

3 голосов
/ 23 ноября 2011

Ваша забытая директива 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]

Скажите, если это работает.

1 голос
/ 22 ноября 2011

Может быть, это очевидно для вас, но в документации поговорим о экранированных символах: Настройте сервер для обработки запросов на URL-адреса, содержащие

Сканер экранирует определенные символы во фрагменте во время преобразования. Чтобы получить исходный фрагмент, не забудьте удалить все символы% XX во фрагменте. В частности,% 26 должен стать &,% 20 должен стать пробелом,% 23 должен стать #, а% 25 должен стать% и т. Д.

1 голос
/ 09 ноября 2011

Если я не ошибаюсь.

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
RewriteRule ^$ /webroot/crawler.php?%1 [L]
0 голосов
/ 22 мая 2012

В htacess работа на виртуальном хосте не работает, поэтому я добавляю в "каталог"

<Directory "X:/DIR">
    RewriteEngine On
    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$
    RewriteRule ^$ /crawler/index.php?_frag=%1  [L]
</Directory>
0 голосов
/ 20 мая 2012

Вот решение, которое предоставляет маршрутизируемый 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...