2011-11-09 17 views
6

Witajcie inni programiści!Indeksowanie AJAX z _escaped_fragment_ w htaccess

Jesteśmy prawie wykończone rozwija pierwszy etap naszej ajax aplikacji internetowej. W naszej aplikacji używamy skrótu fragmenty jak:

http://ourdomain.com/#!list=last_ads&order=date 

Rozumiem google pobierze ten link i złożyć żądanie do serwera w tej formie:

http://ourdomain.com/?_escaped_fragment_=list=last_ads?order=date&direction=desc 

wszystko jest idealne, z wyjątkiem .. .

Chciałbym trasa tego rodzaju wniosek do innego skryptu

tak:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
RewriteRule ^$ /webroot/crawler.php$1 [L] 

Problem polega na tym, że gdy próbuję print_r ($ _ REQUEST) w crawler.php mam tylko:

Array 
(
    [_escaped_fragment_] => list=last_ads?order=date 
    [direction] => desc 
) 

co chciałbym dostać to

Array 
(
    [list] => last_ads 
    [order] => date 
    [directions] => des 
) 

Wiem, że mógłbym użyć php do dalszego łamania pierwszego argumentu, ale nie chcę;)

proszę doradzić

================================================ ==== EDIT ... pewne korekty w tekście i logiki

Odpowiedz

3

swojej zapomniał dyrektywy QSA (każdy brakowało punkt = D)

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
RewriteRule ^$ /webroot/crawler.php%1 [QSA,L] 

Nawiasem mówiąc Twój $1 jest dobrze eee ... bezużyteczne, ponieważ odnosi się do niczego. Powinno to być:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
RewriteRule ^$ /webroot/crawler.php [QSA,L] 

Powiedz, czy to działa.

+0

Myślę, że powinno być "% 1" zamiast "$ 1" http://stackoverflow.com/questions/6654834/difference-between-1-vs-1-in-htaccess – HerrSerker

+0

Masz rację. Poprawione, dziękuję! –

+1

Powinieneś również upuścić ten komentarz na temat $ 1. – HerrSerker

1

Jeśli się nie mylę.

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
RewriteRule ^$ /webroot/crawler.php?%1 [L] 
+0

Jej lepiej, jeśli w crawler.php dodać print_r ($ _ GET); wyjście będzie tablicą [Array ([order] => date ....)] nie string jak w innych przykładach – user956584

1

Może to dla ciebie oczywiste, ale w rozmowie dokumentacji o zbiegłych znaków: Set up your server to handle requests for URLs that contain

Robot ucieka niektóre znaki we fragmencie podczas transformacji. Aby pobrać oryginalny fragment, pamiętaj o przywróceniu znaczenia wszystkie znaki xx% we fragmencie. Dokładniej, 26% powinno stać &, 20% powinno stać się przestrzenią,% 23 powinna stać # i% 25% powinno stać, i tak dalej.

+0

Miałem problem z "& 26", więc piszę prostą poprawkę: if (strstr ($ _ SERVER [ "QUERY_STRING"], "% 26")): $ _SERVER ['QUERY_STRING'] = urldecode ($ _ SERVER ['QUERY_STRING']); parse_str ($ _ SERVER ['QUERY_STRING'], $ _GET); endif; – user956584

0

Oto rozwiązanie, które zapewnia routowalny URL i prawidłowo ustawione parametry zapytań do przetworzenia w skrypcie po stronie serwera.

Przykład: Jeśli chcesz http://yoursite.com/#!/product/20 stać http://yoursite.com/crawler/product/20

pierwsze w .htaccess

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
RewriteRule ^$ /crawler/index.php?_frag=%1 [L] 

Musimy pozbyć się _escaped_fragment_ w adresie URL i zastąpić go czymś innym, np: _frag tak że serwer WWW (Apache) nie przechodzi do przeróbek cyklicznych.

drugie w 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 
0

W pracy htacess w wirtualnego hosta nie działa, więc dodać w "katalogu"

<Directory "X:/DIR"> 
    RewriteEngine On 
    RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
    RewriteRule ^$ /crawler/index.php?_frag=%1 [L] 
</Directory>