代码之家  ›  专栏  ›  技术社区  ›  knb

Google将API键映射到Web服务器范围内(作为env var?在Apache内部?)

  •  1
  • knb  · 技术社区  · 14 年前

    我有一个有很多虚拟主机的网站,每个都注册了几个域名(以.org,.de结尾)、site1.mysite.de、site2.mysite.org

    然后,基于Web服务器上使用的几种编程语言(Perl和PHP),我有不同的模板系统。

    google maps api要求每个vhost都有一个唯一的google maps api密钥。

    我想要一个Web服务器范围的变量$goomapkey,我可以从代码内部调用它。

    在PHP代码中,现在我有了一个Kludgy案例分析解决方案,比如

     $domain = substr($_SERVER['SERVER_NAME'], -3);
     if (".de" == $domain){
       //if ("xxxxxx" eq substr($ENV{SERVER_NAME}, 0, 5)){
    
       //  $gookey = "ABQIAAA...";
       //} else {
         //site1.de   
         $gookey = "ABQIAAAA1Js...";
       //}
     } elseif ("dev" == substr($_SERVER['SERVER_NAME'], 0, 3)){
       //dev.mysite.org
       $gookey = "ABQIAAAA1JsSb...";
     } else {
       //www.mysite.org
       $gookey = "ABQIAAAA1JsS...";
       //TODO: Add more keys for each virtual host, for my.machinename.de, IP-address based URL, ...
     }
    

    …在我的基于PHP的CMS中。这是一个不理想的解决方案,因为它是仅限PHP的,我仍然需要在CMS中的几个HTML模板中设置它,而且情况太多了。

    我希望在构建和评估任何PHP页面模板代码之前,由ApacheWeb服务器在请求循环的早期检查请求*来设置GoogleMapsAPI密钥。

    • 环境变量是一个好的解决方案吗?

    • 应该使用哪种技术来设置$goomapkey变量?

    我更喜欢mod_perl2apache请求处理程序,但是文档很混乱(过去的许多API更改)。我可以使用哪个Apache模块?

    • 是否有一个内置的Apache模块执行相同的操作?
    3 回复  |  直到 14 年前
        1
  •  4
  •   TheDeadMedic    14 年前

    当然,这对少数几个领域来说有点过分了吗?我的意思是,显然您必须经历为每个域申请一个密钥的过程,为什么不单独使用每个项目中的每个密钥呢?

    最优雅的解决方案是切换到不再需要api密钥的google maps api v3。

        2
  •  1
  •   tc.    14 年前

    环境变量是一个好的解决方案吗?

    我不愿使用环境变量来存储“密钥”,除非API密钥不是秘密的(任何人都可以用“查看源代码”来查看它),所以它似乎有点明智。

    你是否认为这是一个“好”的想法是不同的事情,这是一个分层的违反,但其他的也一样。如果您的Web框架(或者您正在使用的任何东西)具有某种类型的站点配置,那么这就是放置它的明显位置。您可以让config代码从环境变量中加载它,但是如果将其保存在config中,那么以后更容易更改它。

    我想要像这样的东西

    $apikeys = array(
      "site1.de" => "...",
      "dev.mysite.org" => "...", 
      "www.mysite.org" => "...",
      "" => "...", // default
    );
    

    然后代码在数组上循环,找到最长的后缀匹配,并使用相应的键。它的优点是可以更容易地在不同的语言之间进行移植(甚至可以编写genapikeys.pl来编写gmapipikes.php)。我也不认为有任何理由有一个默认的关键IIRC谷歌地图拒绝您的请求,如果关键不匹配“推荐人”。

    一个更通用的解决方案是反转主机名(即de.site1,org.mysite.www);然后您可以拥有“com.hostingcompany.www/mysite/”。

    当然,IP地址的顺序是相反的,而IPv6是一种乐趣。不过,我也不确定API键是否支持,所以它可能不相关。

        3
  •  0
  •   symcbean    14 年前

    如果您试图通过mod_perl2填充变量,那么它对php是不可用的——同样,您的php include文件对perl也是不可用的。

    一个环境变量看起来是一个很好的折衷方案——除非您已经从数据文件/A数据库加载了Comon数据。

    是否有一个内置的Apache模块执行相同的操作?

    是的- mod_env 和setenv指令

    C.