1. nginx rewrite 在哪配置
對於nginx的各種指令而言,如果想知道該指令的配置格式和位置,那麼比較好的一種方式就是查看nginx的源碼,正所謂「源碼面前,了無秘密」。
rewrite指令在nginx的http的rewrite模塊中定義(src/http/ngx_http_rewrite_mole.c)。查看一下該模塊的指令數組可以看到如下的代碼:
staticngx_command_tngx_http_rewrite_commands[]={
{ngx_string("rewrite"),
NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE23,
ngx_http_rewrite,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL},
//...
}
從源碼可以看出,rewrite可以出現的地方有4個:NGX_HTTP_SRV_CONF,NGX_HTTP_SIF_CONF,NGX_HTTP_LOC_CONF,NGX_HTTP_LIF_CONF。分別對應著:
NGX_HTTP_SRV_CONF:配置文件中的server域中的任何地方;
NGX_HTTP_SIF_CONF:配置文件中server域中的if配置中;
NGX_HTTP_LOC_CONF:配置文件中的location域中的任何地方;
NGX_HTTP_LIF_CONF:配置文件中的location域中的if配置中;
舉例如下:
//...
server{
//...
rewrite"^/+$"/index.phpbreak;
if($uri~*"^/+abc"){
rewrite"^/+abc"/abc/index.phpbreak;
}
location/xy{
rewrite"^/+xy$"/xy/index.phpbreak;
}
}
2. nginx rewrite規則怎麼配置
rewrite可以出現的地方有4個:NGX_HTTP_SRV_CONF,NGX_HTTP_SIF_CONF,NGX_HTTP_LOC_CONF,NGX_HTTP_LIF_CONF。分別對應著:
NGX_HTTP_SRV_CONF:配置文件中的server域中的任何地方;
NGX_HTTP_SIF_CONF:配置文件中server域中的if配置中;
NGX_HTTP_LOC_CONF:配置文件中的location域中的任何地方;
NGX_HTTP_LIF_CONF:配置文件中的location域中的if配置中;
舉例如下:
//...
server {
//...
rewrite "^/+$" /index.php break;
if ($uri ~* "^/+abc") {
rewrite "^/+abc" /abc/index.php break;
}
location /xy {
rewrite "^/+xy$" /xy/index.php break;
}
}
?
1
其中location的詳細描述和location的強大功能可以在本網站搜索框中輸入「ngingx location」來搜索。
補充
1.break指令
默認值:none ;使用環境:server,location,if ;
該指令的作用是完成當前的規則集,不再處理rewrite指令。
2.if指令
默認值:none ;使用環境:server,location
該指令用於檢查一個條件是否符合,如果條件符合,則執行大括弧內的語句。If指令不支持嵌套,不支持多個條件&&和||處理。
A.變數名,錯誤的值包括:空字元串""或者任何以0開始的字元串
B.變數比較可以使用"="(表示等於)和"!="(表示不等於)
C.正則表達式模式匹配可以使用"~*"和"~"符號
D."~"符號表示區分大小寫字母的匹配
E."~*"符號表示不區分大小寫字母的匹配
F."!~"和"!~*"符號的作用剛好和"~"、"~*"相反,表示不匹配
G."-f"和"!-f"用來判斷文件是否存在
H."-d"和"!-d"用來判斷目錄是否存在
I."-e"和"!-e"用來判斷文件或目錄是否存在
J."-x"和"!-x"用來判斷文件是否為可執行
K.部分正則表達式可以在()內,用$1~$9來訪問
3.return指令
語法:return code ;使用環境:server,location,if ;
該指令用於結束規則的執行並返回狀態碼給客戶端。
示例:如果訪問的URL以".sh"或".bash"結尾,則返回403狀態碼
location ~ .*.(sh|bash)?$
{
return 403;
}
4.rewrite 指令
語法:rewrite regex replacement flag
默認值:none ; 使用環境:server,location,if
該指令根據表達式來重定向URI,或者修改字元串。指令根據配置文件中的順序來執行。注意重寫表達式只對相對路徑有效。如果你想配對主機名,你應該使用if語句,示例如下:
if( $host ~* www.(.*) )
{
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}
rewrite指令的最後一項參數為flag標記,支持flag標記有:
1.last 相當於apache裡面的[L]標記,表示rewrite。
2.break本條規則匹配完成後,終止匹配,不再匹配後面的規則。
3.redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址。
4.permanent 返回301永久重定向, 瀏覽器地址會顯示跳轉後的URL地址。
使用last和break實現URI重寫,瀏覽器地址欄不變。而且兩者有細微差別,使用alias指令必須用last標記;使用proxy_pass指令時,需要使用break標記。Last標記在本條rewrite規則執行完畢後,會對其所在server{......}標簽重新發起請求,而break標記則在本條規則匹配完成後,終止匹配。
一般在跟location中(location /{...})或直接在server標簽中編寫rewrite規則,推薦使用last標記;在非根location中(location /cms/{...}),則使用break。
如果URI中含有參數(/app/test.php?id=5),默認情況下參數會被自動附加到替換串上,你可以通過在替換串的末尾加上?標記來解決這一問題。
3. nginx rewrite 裡面的php能執行 html 500錯誤
截取字元串返回部分字元串2、mb_substr() 使用方法和subst*相同,不過要開啟php.ini裡面extension=php_mbstring dl1擴展,不用擔心,一般的空間商都會開啟這
\ substr如果不行你可以去後盾人
4. nginx下thinkphp框架設置rewrite模式需要配置pathinfo嗎
打開Nginx的配置文件 /usr/local/nginx/conf/nginx.conf 一般是在這個路徑,根據你的安裝路徑可能有所變化。如果你配置了vhost,而且只需要你這一個vhost支持pathinfo的話,可以直接打開你的vhost的配置文件。
5. 如何正確配置Nginx + PHP
先上配置的過程,下面是解釋。
6. nginx+Rewrite規則:全站強制https跳轉,/admin.php 文件除外,它要走http。請問這個規則要怎麼寫
nginx強制使用https訪問(http跳轉到https)
基於nginx搭建了一個https訪問的虛擬主機,監聽的域名是test.com,但是很多用戶不清楚https和http的區別,會很容易敲成http://test.com,這時會報出404錯誤,所以我需要做基於test.com域名的http向https的強制跳轉
我總結了三種方式,跟大家共享一下
nginx的rewrite方法
思路
這應該是大家最容易想到的方法,將所有的http請求通過rewrite重寫到https上即可
配置
server {
listen 192.168.1.111:80;
server_name test.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
搭建此虛擬主機完成後,就可以將http://test.com的請求全部重寫到https://test.com上了
nginx的497狀態碼
error code 497
497 - normal request was sent to HTTPS
解釋:當此虛擬站點只允許https訪問時,當用http訪問時nginx會報出497錯誤碼
思路
利用error_page命令將497狀態碼的鏈接重定向到https://test.com這個域名上
配置
server {
listen 192.168.1.11:443; #ssl埠
listen 192.168.1.11:80; #用戶習慣用http訪問,加上80,後面通過497狀態碼讓它自動跳到443埠
server_name test.com;
#為一個server{......}開啟ssl支持
ssl on;
#指定PEM格式的證書文件
ssl_certificate /etc/nginx/test.pem;
#指定PEM格式的私鑰文件
ssl_certificate_key /etc/nginx/test.key;
#讓http請求重定向到https請求
error_page 497 https://$host$uri?$args;
}
index.html刷新網頁
思路
上述兩種方法均會耗費伺服器的資源,我們用curl訪問.com試一下,看網路的公司是如何實現.com向www..com的跳轉
可以看到網路很巧妙的利用meta的刷新作用,將.com跳轉到www..com.因此我們可以基於http://test.com的虛擬主機路徑下也寫一個index.html,內容就是http向https的跳轉
index.html
<html>
<meta http-equiv="refresh" content="0;url=https://test.com/">
</html>
nginx虛擬主機配置
server {
listen 192.168.1.11:80;
server_name test.com;
location / {
#index.html放在虛擬主機監聽的根目錄下
root /srv/www/http.test.com/;
}
#將404的頁面重定向到https的首頁
error_page 404 https://test.com/;
}
7. 關於nginx中的rewrite問題
\w+ 匹配由數字、26個英文字母或者下劃線組成的字元串
.* 意味著能夠匹配任意數量的任何字元
$1-$9存放著正則表達式中最近的9個正則表達式的匹配結果,這些結果按照子匹配的出現順序依次排列。
$1 代表的是匹配的第一個結果
括弧表示的是表達式定義的「組」(group),並且將匹配這個表達式的字元保存到一個臨時區域(一個正則表達式中最多可以保存9個) 上面的表達式有2個匹配組 (\w+) 和 (.*) 所有後面可以用 $1 和 $2 來用
比如你的例子
^/(\w+)/(.*)$ /$1/index.php last;
/abc123/bcdfda => /abc123/index.php
8. nginx rewrite匹配到"public/"則將其變為"public/index.php_url=/"要怎麼寫"
location/public{
try_files$uri$uri//index.php?_url=/?$query_string;
client_max_body_size10m;
}
你試試
9. nginx rewrite 怎麼寫
Nginx Rewrite規則相關指令有if、rewrite、set、return、break等,其中rewrite是最關鍵的指令。一個簡單的Nginx Rewrite規則語法如下:
rewrite ^/b/(.*)\.html /play.php?video=$1 break;
如果加上if語句,示例如下:
if (!-f $request_filename)
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
Nginx與Apache的Rewrite規則實例對比
10. 怎麼理解 nginx 中 rewrite 的用法
字面意思就是把abc.com/xxx按abc.com/index.php/xxx來解析
對於/index.php/abc這種url,Apache和lighttpd會按"index.php?abc"來解釋,而nginx會認為是請求名字是「index.php」的目錄下的abc文件的內容。所以一些框架,如CI,在nginx下不配置rewrite是無法運行的,而在Apache和lighttpd則正常。另外,好像nginx里index.php會轉換成index_php,(未求證)
解決方法是
location /
{
index index.php;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?$1 last;
break;
}
}