【问题标题】:How to set a custom global from .htaccess如何从 .htaccess 设置自定义全局
【发布时间】:2012-02-05 13:27:11
【问题描述】:

有没有办法从.htaccess 中设置自定义变量,以便每个 php 脚本都可以从中读取?我什么也没去谷歌搜索。

谢谢!

【问题讨论】:

    标签: php .htaccess variables


    【解决方案1】:

    我用环境变量告诉我“5G黑名单”防火墙脚本http://perishablepress.com/5g-blacklist-2013/的哪一部分被渣男触发了

    例如,防火墙的一部分阻止了最常见的垃圾邮件发送者查询字符串:

    RewriteBase /
    RewriteCond %{QUERY_STRING} (\"|%22).*(<|>|%3) [NC,OR]
    RewriteCond %{QUERY_STRING} (javascript:).*(\;) [NC,OR]
    RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3) [NC,OR]
    RewriteCond %{QUERY_STRING} (\\|\.\./|`|=\'$|=%27$) [NC,OR]
    RewriteCond %{QUERY_STRING} (\;|\'|\"|%22).*(union|select|insert|drop|update|md5|benchmark|or|and|if) [NC,OR]
    RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig) [NC,OR]
    RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR]
    RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC]
    RewriteRule .* - [E=BadQueryString,F]
    

    看到 E=BadQueryString 了吗?我补充说。语法当然必须准确。

    然后在我处理 403: Permission denied 错误的 PHP 程序中,我以这种方式使用它(注意此服务器在环境变量名称前添加了“REDIRECT_”):

    if (getenv("REDIRECT_BadQueryString") !== FALSE) {
      $htaccessErrors .= ' BadQueryString';
      if (getenv("REDIRECT_QUERY_STRING") !== FALSE) {
        $htaccessErrors .= getenv("REDIRECT_QUERY_STRING");
      }     
    }
    

    这是另一个.htaccess示例,测试User-Agent服务器变量并使用环境变量,如果设置了,然后环境变量在我的403.php中可用

    SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) BadUserAgent
    <limit GET POST PUT>
    Order Allow,Deny
    Allow from all
    Deny from env=BadUserAgent
    </limit>
    

    【讨论】:

      【解决方案2】:

      如果您希望从 $_GET 数组中访问变量(这将覆盖通过 get 发送到服务器的任何变量)

      RewriteCond %{QUERY_STRING} ^(.*)$
      RewriteRule ^(.*)$ $1?%1&myvar=something
      

      %1 无论查询字符串是什么

      【讨论】:

      • 您可能需要在前面添加RewriteCond %{QUERY_STRING} !myvar 以防止无限循环。
      【解决方案3】:

      您可以在.htaccess(或http.conf)中设置环境变量:

      SetEnv foo bar
      

      并通过

      在 PHP 中访问它们
      $_ENV['foo']
      

      【讨论】:

        【解决方案4】:

        使用mod_setenvif 之类的东西怎么样?更多详细信息,请访问http://httpd.apache.org/docs/current/env.html

        【讨论】:

          【解决方案5】:

          您只能从 .htaccess 中设置环境变量:

          SetEnv MYVAR whatever
          

          这在$_SERVER 数组中可用:

          print $_SERVER["MYVAR"];
          

          所以,不完全是一个全局变量。但对于某些用途仍然有用。

          (另一种选择是声明auto_prepend_file 来预定义变量。但这更像是一种解决方法。)

          【讨论】:

          • +1 我学到了一些新东西。在什么情况下,从 .htaccess 文件中设置环境变量是一种好习惯?
          • 我主要使用它来声明资源/路径名称。但最终,任何可以被视为全局站点设置的东西都是可以的。
          • 谢谢,马里奥。我很欣赏这种洞察力。
          猜你喜欢
          • 1970-01-01
          • 2016-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-10
          • 1970-01-01
          • 2017-12-27
          • 1970-01-01
          相关资源
          最近更新 更多