在htaccess中使用_escaped_fragment_进行可伸缩的AJAX

时间:2011-11-09 10:02:22

标签: php ajax .htaccess url-rewriting web-crawler

你好开发人员了!

我们几乎完成了开发我们的ajax web应用程序的第一阶段。 在我们的应用程序中,我们使用哈希片段,如:

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

我了解google会获取此网址并以此格式向服务器发出请求:

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

一切都很完美,除了......

我想将此类请求发送到另一个脚本

像这样:

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

问题是,当我在crawler.php中尝试print_r($ _ REQUEST)时,我只得到:

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

我想得到的是

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

我知道我可以使用php来进一步打破第一个参数,但我不想;)

请告知

=============================================== ===== 编辑...文本和逻辑中的一些更正

5 个答案:

答案 0 :(得分:3)

你忘记了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 :(得分:1)

如果我没弄错的话。

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

答案 2 :(得分:1)

也许对你很明显,但在文档中谈论转义字符: Set up your server to handle requests for URLs that contain

  

爬虫在转换过程中转义片段中的某些字符。要检索原始片段,请确保取消片段中的所有%XX字符。更具体地说,%26应该变成&,%20应该变成空格,%23应该变成#,%25应该变成%,依此类推。

答案 3 :(得分:0)

这是一个解决方案,它提供了可在服务器端脚本中正确设置的可路由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]

我们需要删除URL中的_escaped_fragment_并将其替换为不同的内容,例如:_frag,以便(Apache)Web服务器不会进入循环重写。

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

答案 4 :(得分:0)

在虚拟主机中的htaccess工作不起作用,所以我添加“目录”

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