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重寫成功。