【问题标题】:Crawlable AJAX with _escaped_fragment_ in htaccess在 htaccess 中使用 _escaped_fragment_ 可抓取的 AJAX
【发布时间】:2023-03-16 04:00:01
【问题描述】:

各位开发者您好!

我们的 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]

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

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

我想得到的是

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

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

请指教

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

【问题讨论】:

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


    【解决方案1】:

    您忘记了 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' stackoverflow.com/questions/6654834/…
    • 那么你也应该放弃关于 $1 的评论。
    • 在他的问题中有一行代码:RewriteRule ^$ /webroot/crawler.php$1 [L] $1 是没用的:要么是 %1,就像你说的那样,要么是 RewriteRule (.*) /webroot/crawler.php?someparam=$1 [L],但它不像写的那样正确。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这是一个解决方案,它提供了一个可路由的 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) 网络服务器就不会进入循环重写。

      第二名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】:

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

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

        【讨论】:

        • 我遇到了一些问题,女巫 "&26" 所以我写了简单的修复: if ( strstr($_SERVER['QUERY_STRING'],'%26') ) : $_SERVER['QUERY_STRING'] = urldecode ($_SERVER['QUERY_STRING']); parse_str($_SERVER['QUERY_STRING'], $_GET ); endif;
        【解决方案5】:

        如果我没记错的话。

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

        【讨论】:

        • 最好在 crawler.php 中添加 print_r($_GET);输出将是一个数组 [ Array ( [order] => date .... ) ] 而不是其他示例中的字符串
        猜你喜欢
        • 1970-01-01
        • 2015-08-28
        • 2023-03-08
        • 2014-07-16
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多