A. 如何用nginx 规则来屏蔽某个URL刷量
如果看nginx日志有url来源指向的话,可以用下面的例子:
if ($http_referer ~* "http://xxxxxx.com") { return 444; }
将其放入NGINX配置文件的HTTP段或者SERVER段落内。
当然,这里也有人遇到跟你类似的问题可以看下网页链接
B. nginx配置文件详解
一、安装Nginx
在安装Nginx之前,需确保系统已经安装了gcc、 openssl-devel、 pcre-devel和zlib-devel软件库。
其中, –with-http_stub_status_mole 可以用来启用 Nginx 的 NginxStatus 功能,以监控 Nginx 的运行状态。
二、Nginx的配置文件结构
Nginx的配置文件nginx.conf位于其安装目录的conf目录下。
nginx.conf由多个块组成,最外面的块是main,main包含Events和HTTP,HTTP包含upstream和多个Server,Server又包含多个location。
main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL匹配特定位置的设置)。
1、main块设置的指令将影响其他所有设置。
2、server块的指令主要用于指定主机和端口。
3、upstream指令主要用于负载均衡,设置一系列的后端服务器。
4、location块用于匹配网页位置。
这四者之间的关系式:server继承main,location继承server,upstream既不会继承其他设置也不会被继承。
在这四个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、HttpGzip Static模块和Http Addition模块等。
三、Nginx的全局配置
events事件指令是设定Nginx的工作模式及连接数上限:
use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。
其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。
最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections。
在作为反向代理时,max_clients变为:max_clients = worker_processes * worker_connections/4。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
四、下面配置Nginx的HttpGzip模块。这个模块支持在线实时压缩输出数据流。
通过/opt/nginx/sbin/nginx -V命令可以查看安装Nginx时的编译选项,由输出可知,已经安装了HttpGzip模块。
五、负载均衡配置
下面设定负载均衡的服务器列表:
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
在上面的设定中,通过upstream指令指定了一个负载均衡器的名称cs.com。这个名称可以任意指定,在后面需要的地方直接调用即可,Nginx的负载均衡模块目前支持4种调度算法。
六、server虚拟主机配置
下面介绍对虚拟主机的配置。
建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过include指令包含进来,这样更便于维护和管理。
server标志定义虚拟主机开始,listen用于指定虚拟主机的服务端口,server_name用来指定IP地址或者域名,多个域名之间用空格分 开。index用于设定访问的默认首页地址,root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
Charset用于 设置网页的默认编码格式。access_log用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。
七、location URL匹配配置
URL地址匹配是进行Nginx配置中最灵活的部分。 location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。使用location URL匹配配置还可以实现反向代理,用于实现PHP动态解析或者负载负载均衡。
以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天。
八、StubStatus模块配置
StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用此功能。
stub_status设置为“on”表示启用StubStatus的工作状态统计功能。access_log 用来指定StubStatus模块的访问日志文件。auth_basic是Nginx的一种认证机制。
auth_basic_user_file用来指定认证的密码文件,由于Nginx的auth_basic认证采用的是与Apache兼容的密码文件,因此需要用Apache的htpasswd命令来生成密码文件。
然后输入两次密码后确认之后添加用户成功。
要查看Nginx的运行状态,可以输入http://ip/NginxStatus,输入创建的用户名和密码就可以看到Nginx的运行状态。
Active connections表示当前活跃的连接数,第三行的三个数字表示 Nginx当前总共处理了34561个连接, 成功创建次握手, 总共处理了354399个请求。
最后一行的Reading表示Nginx读取到客户端Header信息数, Writing表示Nginx返回给客户端的Header信息数,“Waiting”表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数。
在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过error_page指令可以定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面。
特别需要注意的是,这些错误信息的返回页面大小一定要超过512K,否者会被ie浏览器替换为ie默认的错误页面。
C. nginx 拦截url是否有resource
会拦截的,只要是resource开头的文件夹名,都会被拦截,并且抛出500异常。
D. 能不能通过 nginx 判断 url 参数,返回不同页面
为什么不用php或者其他解析服务器来判断,要用web服务器,费力不讨好,没有服务解析只有html更简单,直接访问就好。
可以,去看下nginx重写,要自己写重写规则,根据url不同访问文件不同返回数据不同,
关键字“url重写” “伪静态”
E. Nginx伪静态 修改url 禁止原url的访问
默认URL_MODEL为0的时候是没有路由判断的,下面是我修改U函数的截图和代码。图中标识哪些地方是我增加的。
整个U函数的完整代码就不贴出来了,只贴出我增加的部分,也就是
if(C('URL_MODEL') == 0){这个区间里面的代码做了修改}else{...}
if(C('DIY_ROUTE')){
//重新获取路由规则里面里面的键
$key = $mole.'/'.$var[$varController].'/'.$var[$varAction];
static $router_ruler = array();
if(empty($router_ruler)){
$router_ruler = include(CONF_PATH.'route.php');
}
$url = '/'.route($router_ruler,$key,$vars,$suffix);
}else{
$url = __APP__.'?'.C('VAR_MODULE')."={$mole}&".http_build_query(array_reverse($var));
if($urlCase){
$url = strtolower($url);
}
if(!empty($vars)) {
$vars = http_build_query($vars);
$url .= '&'.$vars;
}
}
OneThink的URL伪静态优化:[2]URL_MODEL为0
上面的代码中加了一个配置参数就是DIY_ROUTE
ThinkPHP的配置文件在Application\Common\Conf\config.php的末尾增加一个元素
'DIY_ROUTE' => true,
上面还导入一个路由文件route.php,该文件放在\Application\Common\Conf\route.php
路由演示代码如下:
return array(
//一级路由
'home/index/about'=>'about',
//二级路由
'home/article/detail' =>array(
1=>'[id]',
2=>'[id]-[p]'
),
//三级路由
'home/article/category'=>array(
'category'=>array(
'1'=>array(
1=>'note',
2=>'note-[p]',
),
'2'=>array(
1=>'news',
2=>'news-[p]',
),
'3'=>array(
1=>'blog',
2=>'blog-[p]',
),
)
)
);
OneThink的URL伪静态优化:[2]URL_MODEL为0
OneThink的URL伪静态优化:[2]URL_MODEL为0
然后增加了一些函数来配合刚刚修改的U函数
OneThink的URL伪静态优化:[2]URL_MODEL为0
首先是路由函数
function route($router_ruler,$url,$params,$suffix){
//路由规则里全写成小写吧
$router_ruler = array_change_key_case($router_ruler);
$router_key = strtolower(trim(trim($url),'/'));
if(isset($router_ruler[$router_key])){
//一级路由
$real_url = $router_ruler[$router_key];
//由于规定参数格式必须是数组,所以这里只存在是数组和不是数组(为空)的情况
if(is_array($real_url)){
//看其是不是索引数组
if(array_proct(array_map('is_numeric', array_keys($real_url)))==1){
//二级路由
if(is_array($params)){
$real_url = routeMatch($real_url[count($params)],$params);
}
}else{
//三级路由
foreach($params as $k =>$v){
if(array_key_exists($k,$real_url)){
$routeReg = $real_url[$k][$v][count($params)];
unset($params[$k]);
$real_url = routeMatch($routeReg,$params);
}
}
}
}
if($suffix) {
$suffix = $suffix===true?C('URL_HTML_SUFFIX'):$suffix;
if($pos = strpos($suffix, '|')){
$suffix = substr($suffix, 0, $pos);
}
if($suffix && '/' != substr($url,-1)){
$real_url .= '.'.ltrim($suffix,'.');
}
}
}else{
$real_url = urlBuild($url,$params);
}
return $real_url;
}
F. nginx如何截取url部分字符并替换,求助
^|String.prototype.getQuery = function(name)
{
var reg = new RegExp("(^|抄&)"+ name +"=([^&]*)(&|$)");
var r = this.substr(this.indexOf("\?")+1).match(reg);
if (r!=null) return unescape(r[2]); return null;
}
var s = "web1.aspx?status=item&mode=edit";
alert(s.getQuery("status"));
alert(s.getQuery("mode"));
String.prototype.getQuery = function(name)
的意思是为String对象增加一个getQuery(name)方法.
G. nginx服务器怎样去掉url中的index.php
apache环境下: 通过 .htaccess 文件来设置一些简单的规则删除它。下面是一个例子,使用“negative”方法将非指定内容进行重定向: RewriteEngine on RewriteCond $1 !^(index\.php|images|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L] 如...
H. nginx location 路径匹配:不含某字符的路径
nginx不支持非正则,所以,没有办法一条实现这个你这个功能,只能“曲线救国回”,要麻烦点答,多建虚机:
还有就是浏览器#号不会被传入到服务端,所以,你要替换掉这个符号,我这里用的是@
set $ip 192.168.0.2;
if ($request_uri ~* /@/(.*)+) {
set $ip 192.168.0.1;
}
location / {
proxy_pass http: //$ip;
}
I. nginx配置文件重写url:去掉地址栏参数值为空的参数的正则怎么写
URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中
Nginx URL重写(rewrite)介绍
和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。
rewrite语法格式及参数语法说明如下:
rewrite<regex><replacement>[flag];
关键字 正则 替代内容 flag标记
关键字:其中关键字error_log不能改变
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
rewrite参数的标签段位置:
server,location,if
例子:
rewrite ^/(.*) m/$1 permanent;
说明:
rewrite为固定关键字,表示开始进行rewrite匹配规则
regex部分是^/(.*),这是一个正则表达式,匹配完整的域名和后面的路径地址
replacement部分是om/$1 $1,是取自regex部分()里的内容。匹配成功后跳转到的URL。
flag部分permanent表示永久301重定向标记,即跳转到新的hm/$1地址上
regex常用正则表达式说明
字符
描述
将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“ ”匹配一个换行符,而“$”则匹配“$”
^
匹配输入字符串的起始位置
$
匹配输入字符串的结束位置
*
匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+
匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o”
?
匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,"?"等效于"{0,1}"
.
匹配除“ ”之外的任何单个字符,若要匹配包括“ ”在内的任意字符,请使用诸如“[. ]”之类的模式。
(pattern)
匹配括号内pattern并可以在后面获取对应的匹配,常用$0...$9属性获取小括号中的匹配内容,要匹配圆括号字符需要(Content)
rewrite企业应用场景
Nginx的rewrite功能在企业里应用非常广泛:
u可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
u为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
u网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com
u根据特殊变量、目录、客户端的信息进行URL调整等
Nginx配置rewrite过程介绍
(1)创建rewrite语句
vi conf/vhost/www.abc.com.conf
#vi编辑虚拟主机配置文件
文件内容
server {
listen 80;
server_name abc.com;
rewrite ^/(.*) /$1permanent;
}
server {
listen 80;
server_name www.abc.com;
location / {
root /data/www/www;
index index.html index.htm;
}
error_log logs/error_www.abc.com.log error;
access_log logs/access_www.abc.com.log main;
}
或者
server {
listen 80;
server_name abc.com www.abc.com;
if ( $host != 'www.abc.com' ) {
rewrite ^/(.*) com/$1 permanent;
}
location / {
root /data/www/www;
index index.html index.htm;
}
error_log logs/error_www.abc.com.log error;
access_log logs/access_www.abc.com.log main;
}
(2)重启服务
确认无误便可重启,操作如下:
nginx -t
#结果显示ok和success没问题便可重启
nginx -s reload
(3)查看跳转效果
打开浏览器访问abc.com
页面打开后,URL地址栏的abc.com变成了www.abc.com说明URL重写成功。