欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

为PHP设置服务器(Apache/Nginx)环境变量 也可在htaccess 中设置 有大用

[导读] 设置环境变量常见的地方为区分开发环境 生产环境,或者定义一些数据库的帐号密码设置Apache环境变量指令设置当前环境变量为DEVSetEnv RUNTIME_ENVIROMENT DEV数据库帐号密码SetEnv MYSQL_USERNAME rootSetEn

SetEnv 的 htaccess 的例子见 /node/7530



设置环境变量常见的地方为区分开发环境/生产环境,或者定义一些数据库的帐号密码

设置Apache环境变量

指令

设置当前环境变量为DEV

SetEnv RUNTIME_ENVIROMENT DEV

数据库帐号密码

SetEnv MYSQL_USERNAME root
SetEnv MYSQL_PASSWORD root

配置文件格式

<VirtualHost *:80>
    ServerAdmin admin@admin.com
    DocumentRoot "/var/www/"
    ServerName localhost
    SetEnv RUNTIME_ENVIROMENT DEV
    SetEnv MYSQL_USERNAME root
    SetEnv MYSQL_PASSWORD root
    ErrorLog "logs/error.log"
    CustomLog "logs/access.log" common
</VirtualHost>

设置Nginx环境变量

指令

设置当前环境变量为DEV

fastcgi_param RUNTIME_ENVIROMENT 'DEV'

数据库帐号密码

fastcgi_param MYSQL_USERNAME 'root'
fastcgi_param MYSQL_PASSWORD 'root'

配置文件格式

在fastcgi_params文件中配置

fastcgi_param RUNTIME_ENVIROMENT 'DEV';
fastcgi_param MYSQL_USERNAME 'root';
fastcgi_param MYSQL_PASSWORD 'root';

在nginx.conf中配置

server {
    listen   80; 
    root /var/www;
    index index.php;
    server_name localhost;
    location /
    {   
         index index.php;
    }   

    location ~ .*\.(php|php5)?$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }   
}

为PHP脚本设置环境变量

为当前用户临时设置

临时设置只需要执行

export KEY=VALUE

为当前用户永久设置

~/.bashrc(不同系统各有不同)中写

为所有用户(不包括root)设置

创建文件/etc/profile.d/test.sh,写入

KEY=VALUE

为所有用户(包括root)设置

/etc/environment中写入

KEY=VALUE

注意,这个文件的生效时间是用户登录时,所以对于root来说,需要重启机器

在Supervisor中设置

有的时候PHP脚本是用Supervisor来控制的,所以记得设置supervisor配置中的environment项

在PHP中调用服务器环境变量

在PHP中有两个调用方式:

$env = getenv('RUNTIME_ENVIROMENT');

还有超全局变量方式:

$env = $_SERVER['RUNTIME_ENVIROMENT'];


来自 http://www.php100.com/html/it/biancheng/2015/0304/8698.html


apache指令setenv setenvif

 

SetEnv 指令
说明 设置环境变量 
语法 SetEnv env-variable value
 
SetEnvIf 指令
说明 根据客户端请求属性设置环境变量 
语法 SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ... 
作用域 server config, virtual host, directory, .htaccess
 
SetEnvIf指令根据客户端的请求属性设置环境变量。第一个参数attribute必须是下列三种类别之一:
 
一个HTTP请求头域(参见RFC2616);例如:Host, User-Agent, Referer, Accept-Language 。可以用一个正则表达式来进行匹配。 
下列请求属性之一: 
Remote_Host 远程主机名(若可用) 
Remote_Addr 远程主机IP地址 
Server_Addr 接收到请求的服务器IP地址(2.0.43及以后版本) 
Request_Method 所用的请求方法(GET, POST等等) 
Request_Protocol 请求所使用的协议及其版本("HTTP/0.9", "HTTP/1.0", "HTTP/1.1"等) 
Request_URI 在HTTP请求行中请求的资源(通常是URL中去除协议、主机以及查询字符串后剩余的部分)。 
列出的与该请求关联的环境变量名字中的一个。这将允许SetEnvIf指令基于预先匹配的结果进行测试。只有那些由较早的SetEnvIf[NoCase]指令定义的环境变量才可以按照这种方式测试。"较早的"意思是它们在更上层的作用域(比如全局范围)中被定义或者在同一作用域中较早出现。只有在请求的属性未能得到匹配并且attribute没有使用正则表达式的时候,环境变量才会被考虑。
 
如:不记录192.168.7.139的访问日志
首先设置环境变量 SetEnvIf Remote_Addr "192.168.7.139" dontlog
使用上面设置的环境变量 
CustomLog "logs/access_log" common env=!dontlog
 
 SetEnvIfNoCase
说明: Sets environment variables based on attributes of the request without respect to case
语法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
上下文: 服务器配置, 虚拟主机, 目录, .htaccess
覆盖项: FileInfo
状态: Base
模块: mod_setenvif
兼容性: Apache 1.3 and above
 
 
The SetEnvIfNoCase is semantically identical to the SetEnvIf directive, and differs only in that the regular expression matching is performed in a case-insensitive manner. For example:
SetEnvIfNoCase Host Apache.Org site=apache 
This will cause the site environment variable to be set to "apache" if the HTTP request header field Host: was included and contained Apache.Org, apache.org, or any other combination.
 
SetEnvIfNoCase 当满足某个条件时,为变量赋值,一般结合其他指令使用。
如:
1。SetEnvIf Request_URI "/logo(.)+" local_ref=0
Allow from env=local_ref  当local_ref有值时,可以访问。
2。SetEnvIfNoCase Request_URI .js$ useless-file
CustomLog logs/hebgc.com/access.log combined env=!useless-file
当满足条件时才记录日志。

来自 http://blog.sina.com.cn/s/blog_6f7df0610101fgdm.html


Htaccess使用实例

 
 
 
 

.htaccess使用实例 收集和整理常用的.htaccess应用,这里都是具体的应用实例,给出很多典型的语法,对于常用的rewrite等语法,请参考对应的词条,在具体的例子中我们会用到rewrite,但是这里不会专门讲解相关的语法。

目录

屏蔽IP

禁止特定的IP

<Files 403.shtml>
order allow,deny
allow from all
</Files>
deny from 1.1.1.1 ;写要封的IP

只允许特定的IP访问

order deny,allow
deny from all
allow from 61.228.209.85

主域名指向子目录

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$
RewriteCond %{REQUEST_URI} !^/subfolder/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subfolder/$1
RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$
RewriteRule ^(/)?$ subfolder/index.php [L]

将 yourmaindomain.com修改为你的域名,将subfolder修改为你要指向的public_html下的子目录.最后一行中的index.php修改为你的网站的主页名称.

防止.htaccess文件被查看

<Files .htaccess>
order allow,deny
deny from all
</Files>

其他文件也可以类似这样处理

规范www

全部统一到带 www,例如将83blog.com 统一到 www.83blog.com

RewriteEngine on
RewriteCond %{HTTP_HOST} ^yourdomain\.com$ [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301]

全部统一到不带www,例如将 www.idcspy.com 统一到 idcspy.com

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.yourdomain\.com$ [NC]
RewriteRule ^(.*)$ http://yourdomain.com/$1 [L,R=301]

防止别人的域名解析到自己的独立IP

RewriteEngine On
RewriteCond %{HTTP_HOST} !(^www\.yourdomain\.com$) [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301]

这个可以完成如下几个功能:

  1. 如果你的网站绑定多个域名,为了只使用一个域名,就可以设置如上规则,例如网站绑定了 www.idcspy.com www.enmabiz.com 那么为了防止重复的url,就可以把上面的域名设置为www.idcspy.com,这样来自www.enmabiz.com所有的访问都会重定向到 www.idcspy.com
  2. 如果你用的是独立IP,那么别人就可以把它的域名解析到你的IP上,这个时候可以用这个规则,其他所有解析到你的IP上的域名都会转向到你设置的域名上。

设置时区

在 Htaccess文件中加入 SetEnv TZ Asia/Chongqing 设置时区,Asia/Chongqing 换成你要设置的时区,Asia/Chongqing就表示北京时间。

自定义错误页面

下面是各种错误页面的定义方式,把 /cgi-bin/exxx.php 部分修改成你要使用的错误页面的路径即可。

#BAD_REQUEST
ErrorDocument 400 /cgi-bin/e400.php
 
#UNAUTHORIZED
ErrorDocument 401 /cgi-bin/e401.php
 
#FORBIDDEN 禁止访问
ErrorDocument 403 /cgi-bin/e403.php
 
#NOT_FOUND 找不到文件
ErrorDocument 404 /cgi-bin/e404.php
 
#METHOD_NOT_ALLOWED 
ErrorDocument 405 /cgi-bin/e405.php
 
#REQUEST_TIME_OUT
ErrorDocument 408 /cgi-bin/e408.php
 
#GONE
ErrorDocument 410 /cgi-bin/e410.php
 
#LENGTH_REQUIRED
ErrorDocument 411 /cgi-bin/e411.php
 
#PRECONDITION_FAILED
ErrorDocument 412 /cgi-bin/e412.php
 
#REQUEST_ENTITY_TOO_LARGE
ErrorDocument 413 /cgi-bin/e413.php
 
#REQUEST_URI_TOO_LARGE
ErrorDocument 414 /cgi-bin/e414.php
 
#UNSUPPORTED_MEDIA_TYPE
ErrorDocument 415 /cgi-bin/e415.php
 
#INTERNAL_SERVER_ERROR 内部服务器错误
ErrorDocument 500 /cgi-bin/e500.php
 
#NOT_IMPLEMENTED
ErrorDocument 501 /cgi-bin/e501.php
 
#BAD_GATEWAY
ErrorDocument 502 /cgi-bin/e502.php
 
#SERVICE_UNAVAILABLE 服务不可用
ErrorDocument 503 /cgi-bin/e503.php
 
#VARIANT_ALSO_VARIES
ErrorDocument 506 /cgi-bin/e506.php

启用Deflate

在Htaccess中加入下面代码给指定文件后缀启用Deflate。Apache2.0以上版本支持Deflate。

<IfModule mod_deflate.c>
<FilesMatch "\.(js|css)$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>

<FilesMatch "\.(js|css)$"> 指定启用Deflate的文件后缀,增加的后缀用|隔开即可,例如 <FilesMatch "\.(js|css|html|php)$">

设置默认首页及顺序

在.htaccess文件中加入

DirectoryIndex index.html index.htm index.php index.cgi 

禁止显示目录列表

如果目录没有默认首页文件,将会列出文件列表,可能造成安全隐患,为避免这种情况(而不必创建一堆的新index文件),你可以在你的.htaccess文档中键入以下命令,用以阻止目录列表的显示:

Options -Indexes 

301 302 转向

这个可以使用Rewrite实现,也可以利用Redirect实现,更详细的说明请大家参考 301转向,这里只给出几个简单的例子。 重定向文件:

Redirect 301 /orddir/ordfile.html http://www.zzbaike.com/newdir/newfile

重定向目录

Redirect 301 /orddir/ http://www.zzbaike.com/newdir/

这个会把旧目录的文件全部转向到新目录的对应文件

也可以用Rewrite实现:

转向到文件

RewriteEngine On
RewriteRule ^(.*)$ http://www.zzbaike.com/newfile.html [R=301,L]

这个把所有请求转向到 http://www.zzbaike.com/newfile.html

转向目录

RewriteEngine On
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

将以上的代码301改成302就是302转向

给目录及文件设置密码保护

给目录设置密码保护,在该目录建立一个.htaccess文件,放入如下内容:

AuthUserFile /opt/guide/www.zzbaike.com/.htpasswd
AuthType Basic
AuthName "Member Page"
require valid-user

AuthUserFile 设置密码文件的路径


来自 http://www.zzbaike.com/wiki/Htaccess%E4%BD%BF%E7%94%A8%E5%AE%9E%E4%BE%8B


普通分类: