整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          CSS 將會推出 if() 語句,一次大膽的嘗試!

          CSS 將會推出 if() 語句,一次大膽的嘗試!

          SS 的條件判斷語句 if()

          上周,在西班牙拉科魯尼亞舉行的CSS WG面對面會議中,讓人特別激動的一個決議是大家一致同意向 CSS 中添加內聯 if() 語法。

          實際上,一個功能在被接受之前經常會遭到幾次拒絕,例如CSS嵌套、:has()、容器查詢等都是在多次被拒后的最終迭代版本。if()在 2018 年曾被拒絕,其語法與我提出的非常相似。不同的是,現在我們已經有了樣式查詢功能,可以簡單地使用相同的條件語法(結合Tab@when提案中提出的media()supports())。

          if() 的作用?會取代樣式查詢嗎?

          相反地,if()提供了樣式查詢無法涵蓋的功能。如果您能夠使用樣式查詢來解決問題,那絕對應該優先選擇樣式查詢——它們通常是更優的解決方案。但是,有些情況下,樣式查詢無法滿足需求。

          舉個例子,考慮一個名為--variant的自定義屬性:

          它可能包括設置背景顏色、邊框顏色、文本顏色、圖標等。然而,實際上它的確切值可能從未直接在任何地方被逐字使用,而是作為影響其他屬性值的設置參數。

          樣式查詢讓我們成功了一半:

          但是,樣式查詢僅適用于后代。我們不能這樣做:

          通常,我們在元素上需要設置的聲明非常少,有時僅僅一個。但是,即使只有一個聲明,對于許多(或許是大部分)更高級的自定義屬性用例而言,仍顯得過多,使得使用自定義屬性顯得不太實用。因此,組件庫常常轉而使用表示性屬性,如pill、outline、size等。

          雖然這些表示性屬性初看之下似乎很合適,甚至在開發體驗(DX)方面似乎更優(使用的字符更少——至少比為每個元素設置單獨的變量要少),但它們存在一些可用性問題:

          靈活性降低

          它們不能基于選擇器、媒體查詢等有條件地應用。更改它們需要更多 JS。如果它們在另一個組件中使用,那么您就是 SOL,而對于(可繼承的)自定義屬性,您可以在父組件上設置屬性,并且它將向下繼承。

          冗長

          它們必須應用于單個實例,并且不能被繼承。即使人們使用某種形式的模板化或組件化來減少重復,他們在使用開發工具進行調試時仍然必須仔細研究這些屬性。

          缺乏一致性

          由于幾乎每個成熟的組件都支持自定義屬性,因此用戶必須記住哪些樣式是通過屬性完成的,哪些樣式是通過自定義屬性完成的。這種區別通常是任意的,因為它不是由用例驅動的,而是由實施便利性驅動的。

          使用if(),上面的示例成為可能:

          雖然這是主要用例,但事實證明,制作媒體查詢并支持 if() 條件語法的條件部分也非常容易。由于它是一個函數,因此它的參數(包括條件!)可以存儲在其他自定義屬性中。這意味著您可以執行以下操作:

          然后定義如下值:


          就像 JS 中的三元組一樣,對于只有一小部分值變化的情況,它也可能更符合人體工程學:

          瀏覽器支持了嗎?

          不,它還沒有出現在瀏覽器中,而且一段時間內也不會出現。最樂觀的估計是 2 年左右,前提是該過程不會在任何時候停止(通常會發生這種情況)。

          語法辯論通常會花費很長時間,因為對于語法每個人都意見不一。

          所以需要一段時間去完成這些工作

          、語句

          JavaScript 程序的執行單位為行(line),也就是一行一行地執行。一般情況下,每一行就是一個語句。

          語句(statement)是為了完成某種任務而進行的操作,比如下面就是一行賦值語句。

          var a=1 + 3;
          

          這條語句先用var命令,聲明了變量a,然后將1 + 3的運算結果賦值給變量a。

          1 + 3叫做表達式(expression),指一個為了得到返回值的計算式。語句和表達式的區別在于,前者主要為了進行某種操作,一般情況下不需要返回值;后者則是為了得到返回值,一定會返回一個值。凡是 JavaScript 語言中預期為值的地方,都可以使用表達式。比如,賦值語句的等號右邊,預期是一個值,因此可以放置各種表達式。

          語句以分號結尾,一個分號就表示一個語句結束。多個語句可以寫在一行內。

          var a=1 + 3 ; var b='abc';
          

          分號前面可以沒有任何內容,JavaScript 引擎將其視為空語句。

          ;;;
          

          上面的代碼就表示3個空語句。

          表達式不需要分號結尾。一旦在表達式后面添加分號,則 JavaScript 引擎就將表達式視為語句,這樣會產生一些沒有任何意義的語句。

          1 + 3;'abc';
          

          上面兩行語句只是單純地產生一個值,并沒有任何實際的意義。

          2、變量

          2.1、概念

          變量是對“值”的具名引用。變量就是為“值”起名,然后引用這個名字,就等同于引用這個值。變量的名字就是變量名。

          var a=1;
          

          上面的代碼先聲明變量a,然后在變量a與數值1之間建立引用關系,稱為將數值1“賦值”給變量a。以后,引用變量名a就會得到數值1。最前面的var,是變量聲明命令。它表示通知解釋引擎,要創建一個變量a。

          注意,JavaScript 的變量名區分大小寫,A和a是兩個不同的變量。

          變量的聲明和賦值,是分開的兩個步驟,上面的代碼將它們合在了一起,實際的步驟是下面這樣。

          var a;
          a=1;
          

          如果只是聲明變量而沒有賦值,則該變量的值是undefined。undefined是一個 JavaScript 關鍵字,表示“無定義”。

          var a;
          a // undefined
          

          如果變量賦值的時候,忘了寫var命令,這條語句也是有效的。

          var a=1;// 基本等同a=1;
          

          但是,不寫var的做法,不利于表達意圖,而且容易不知不覺地創建全局變量,所以建議總是使用var命令聲明變量。

          如果一個變量沒有聲明就直接使用,JavaScript 會報錯,告訴你變量未定義。

          x// ReferenceError: x is not defined
          

          上面代碼直接使用變量x,系統就報錯,告訴你變量x沒有聲明。

          可以在同一條var命令中聲明多個變量。

          var a, b;
          

          JavaScript 是一種動態類型語言,也就是說,變量的類型沒有限制,變量可以隨時更改類型。

          var a=1;
          a='hello';
          

          上面代碼中,變量a起先被賦值為一個數值,后來又被重新賦值為一個字符串。第二次賦值的時候,因為變量a已經存在,所以不需要使用var命令。

          如果使用var重新聲明一個已經存在的變量,是無效的。

          var x=1;var x;
          x // 1
          

          上面代碼中,變量x聲明了兩次,第二次聲明是無效的。

          但是,如果第二次聲明的時候還進行了賦值,則會覆蓋掉前面的值。

          var x=1;var x=2;// 等同于var x=1;var x;
          x=2;
          


          2.2、變量提升

          JavaScript 引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運行。這造成的結果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。

          console.log(a);var a=1;
          

          上面代碼首先使用console.log方法,在控制臺(console)顯示變量a的值。這時變量a還沒有聲明和賦值,所以這是一種錯誤的做法,但是實際上不會報錯。因為存在變量提升,真正運行的是下面的代碼。

          var a;console.log(a);
          a=1;
          

          最后的結果是顯示undefined,表示變量a已聲明,但還未賦值。

          3、標識符

          標識符(identifier)指的是用來識別各種值的合法名稱。最常見的標識符就是變量名,以及后面要提到的函數名。JavaScript 語言的標識符對大小寫敏感,所以a和A是兩個不同的標識符。

          標識符有一套命名規則,不符合規則的就是非法標識符。JavaScript 引擎遇到非法標識符,就會報錯。

          簡單說,標識符命名規則如下。

          • 第一個字符,可以是任意 Unicode 字母(包括英文字母和其他語言的字母),以及美元符號($)和下劃線(_)。
          • 第二個字符及后面的字符,除了 Unicode 字母、美元符號和下劃線,還可以用數字0-9。

          下面這些都是合法的標識符。

          arg0
          _tmp
          $elem
          π
          

          下面這些則是不合法的標識符。

          1a // 第一個字符不能是數字
          23 // 同上
          *** // 標識符不能包含星號
          a+b // 標識符不能包含加號
          -d // 標識符不能包含減號或連詞線
          

          中文是合法的標識符,可以用作變量名。

          var 臨時變量=1;
          
          JavaScript 有一些保留字,不能用作標識符:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。

          4、注釋

          源碼中被 JavaScript 引擎忽略的部分就叫做注釋,它的作用是對代碼進行解釋。Javascript 提供兩種注釋的寫法:一種是單行注釋,用//起頭;另一種是多行注釋,放在/*和*/之間。

          // 這是單行注釋/*
           這是
           多行
           注釋
          */
          

          此外,由于歷史上 JavaScript 可以兼容 HTML 代碼的注釋,所以<!--和-->也被視為合法的單行注釋。

          x=1; <!-- x=2;
          --> x=3;
          

          上面代碼中,只有x=1會執行,其他的部分都被注釋掉了。

          需要注意的是,-->只有在行首,才會被當成單行注釋,否則會當作正常的運算。

          function countdown(n) { 
          while (n --> 0) console.log(n);
          }
          countdown(3)// 2// 1// 0
          

          上面代碼中,n --> 0實際上會當作n-- > 0,因此輸出2、1、0。

          5、區塊

          JavaScript 使用大括號,將多個相關的語句組合在一起,稱為“區塊”(block)。

          對于var命令來說,JavaScript 的區塊不構成單獨的作用域(scope)。

          { var a=1;
          }
          a // 1
          

          上面代碼在區塊內部,使用var命令聲明并賦值了變量a,然后在區塊外部,變量a依然有效,區塊對于var命令不構成單獨的作用域,與不使用區塊的情況沒有任何區別。在 JavaScript 語言中,單獨使用區塊并不常見,區塊往往用來構成其他更復雜的語法結構,比如for、if、while、function等。

          6、條件語句

          JavaScript 提供if結構和switch結構,完成條件判斷,即只有滿足預設的條件,才會執行相應的語句。

          6.1、if 結構

          if結構先判斷一個表達式的布爾值,然后根據布爾值的真偽,執行不同的語句。所謂布爾值,指的是 JavaScript 的兩個特殊值,true表示真,false表示偽。

          if (布爾值)
           語句;
          // 或者if (布爾值) 語句;
          

          上面是if結構的基本形式。需要注意的是,“布爾值”往往由一個條件表達式產生的,必須放在圓括號中,表示對表達式求值。如果表達式的求值結果為true,就執行緊跟在后面的語句;如果結果為false,則跳過緊跟在后面的語句。

          if (m===3)
           m=m + 1;
          

          上面代碼表示,只有在m等于3時,才會將其值加上1。

          這種寫法要求條件表達式后面只能有一個語句。如果想執行多個語句,必須在if的條件判斷之后,加上大括號,表示代碼塊(多個語句合并成一個語句)。

          if (m===3) {
           m +=1;
          }
          

          建議總是在if語句中使用大括號,因為這樣方便插入語句。

          注意,if后面的表達式之中,不要混淆賦值表達式(=)、嚴格相等運算符(===)和相等運算符(==)。尤其是賦值表達式不具有比較作用。

          var x=1;var y=2;
          if (x=y) { console.log(x);
          }// "2"
          

          上面代碼的原意是,當x等于y的時候,才執行相關語句。但是,不小心將嚴格相等運算符寫成賦值表達式,結果變成了將y賦值給變量x,再判斷變量x的值(等于2)的布爾值(結果為true)。

          這種錯誤可以正常生成一個布爾值,因而不會報錯。為了避免這種情況,有些開發者習慣將常量寫在運算符的左邊,這樣的話,一旦不小心將相等運算符寫成賦值運算符,就會報錯,因為常量不能被賦值。

          if (x=2) {
           // 不報錯
          if (2=x) { 
           // 報錯
          

          至于為什么優先采用“嚴格相等運算符”(===),而不是“相等運算符”(==),請參考《運算符》章節。

          6.2、if...else 結構

          if代碼塊后面,還可以跟一個else代碼塊,表示不滿足條件時,所要執行的代碼。

          if (m===3) { 
          // 滿足條件時,執行的語句
          }
           else { 
           // 不滿足條件時,執行的語句
          }
          

          上面代碼判斷變量m是否等于3,如果等于就執行if代碼塊,否則執行else代碼塊。

          對同一個變量進行多次判斷時,多個if...else語句可以連寫在一起。

          if (m===0) { 
          // ...} 
          else if (m===1) { 
           // ...} 
           else if (m===2) { 
           // ...} 
           else { // ...}
          

          else代碼塊總是與離自己最近的那個if語句配對。

          var m=1;
          var n=2;
          if (m !==1)
          if (n===2) 
          console.log('hello');
          else console.log('world');
          

          上面代碼不會有任何輸出,else代碼塊不會得到執行,因為它跟著的是最近的那個if語句,相當于下面這樣。

          if (m !==1) { 
          if (n===2) 
          { console.log('hello');	
           }
           else { console.log('world');
           }
          }
          

          如果想讓else代碼塊跟隨最上面的那個if語句,就要改變大括號的位置。

          if (m !==1) { 
          if (n===2) { 
          console.log('hello');	
           }
          } 
          else { console.log('world');
          }// world
          


          6.3、switch 結構

          多個if...else連在一起使用的時候,可以轉為使用更方便的switch結構。

          switch (fruit) { 
          case "banana": // ...
           break; 
          case "apple": // ...
           break; 
          default: // ...}
          

          上面代碼根據變量fruit的值,選擇執行相應的case。如果所有case都不符合,則執行最后的default部分。需要注意的是,每個case代碼塊內部的break語句不能少,否則會接下去執行下一個case代碼塊,而不是跳出switch結構。

          var x=1;
          switch (x) { 
          case 1: 
          console.log('x 等于1'); 
          case 2: 
          console.log('x 等于2'); 
          default: console.log('x 等于其他值');
          }// x等于1// x等于2// x等于其他值
          

          上面代碼中,case代碼塊之中沒有break語句,導致不會跳出switch結構,而會一直執行下去。正確的寫法是像下面這樣。

          switch (x) { 
          case 1: console.log('x 等于1'); 
           break; 
           case 2: console.log('x 等于2'); 
           break; 
           default: console.log('x 等于其他值');
          }
          

          switch語句部分和case語句部分,都可以使用表達式。

          switch (1 + 3) { case 2 + 2:
           f(); break; default:
           neverHappens();
          }
          

          上面代碼的default部分,是永遠不會執行到的。

          需要注意的是,switch語句后面的表達式,與case語句后面的表示式比較運行結果時,采用的是嚴格相等運算符(===),而不是相等運算符(==),這意味著比較時不會發生類型轉換。

          var x=1;
          switch (x) { 
          case true: console.log('x 發生類型轉換'); 
          break; 
          default: console.log('x 沒有發生類型轉換');
          }// x 沒有發生類型轉換
          

          上面代碼中,由于變量x沒有發生類型轉換,所以不會執行case true的情況。這表明,switch語句內部采用的是“嚴格相等運算符”,詳細解釋請參考《運算符》一節。

          6.4、三元運算符 ?:

          JavaScript 還有一個三元運算符(即該運算符需要三個運算子)?:,也可以用于邏輯判斷。

          (條件) ? 表達式1 : 表達式2
          

          上面代碼中,如果“條件”為true,則返回“表達式1”的值,否則返回“表達式2”的值。

          var even=(n % 2===0) ? true : false;
          

          上面代碼中,如果n可以被2整除,則even等于true,否則等于false。它等同于下面的形式。

          var even;if (n % 2===0) {
           even=true;
          } else {
           even=false;
          }
          

          這個三元運算符可以被視為if...else...的簡寫形式,因此可以用于多種場合。

          var myVar;console.log(
           myVar ? 'myVar has a value' : 'myVar does not have a value')
          // myVar does not have a value
          

          上面代碼利用三元運算符,輸出相應的提示。

          var msg='數字' + n + '是' + (n % 2===0 ? '偶數' : '奇數');
          

          上面代碼利用三元運算符,在字符串之中插入不同的值。

          7、循環語句

          循環語句用于重復執行某個操作,它有多種形式。

          7.1、while 循環

          While語句包括一個循環條件和一段代碼塊,只要條件為真,就不斷循環執行代碼塊。

          while (條件)
           語句;// 或者while (條件) 語句;
          

          while語句的循環條件是一個表達式,必須放在圓括號中。代碼塊部分,如果只有一條語句,可以省略大括號,否則就必須加上大括號。

          while (條件) {
           語句;
          }
          

          下面是while語句的一個例子。

          var i=0;while (i < 100) { console.log('i 當前為:' + i);
           i=i + 1;
          }
          

          上面的代碼將循環100次,直到i等于100為止。

          下面的例子是一個無限循環,因為循環條件總是為真。

          while (true) { console.log('Hello, world');
          }
          


          7.2、for 循環

          for語句是循環命令的另一種形式,可以指定循環的起點、終點和終止條件。它的格式如下。

          for (初始化表達式; 條件; 遞增表達式)
           語句// 或者for (初始化表達式; 條件; 遞增表達式) {
           語句
          }
          

          for語句后面的括號里面,有三個表達式。

          • 初始化表達式(initialize):確定循環變量的初始值,只在循環開始時執行一次。
          • 條件表達式(test):每輪循環開始時,都要執行這個條件表達式,只有值為真,才繼續進行循環。
          • 遞增表達式(increment):每輪循環的最后一個操作,通常用來遞增循環變量。

          下面是一個例子。

          var x=3;for (var i=0; i < x; i++) { console.log(i);
          }// 0// 1// 2
          

          上面代碼中,初始化表達式是var i=0,即初始化一個變量i;測試表達式是i < x,即只要i小于x,就會執行循環;遞增表達式是i++,即每次循環結束后,i增大1。

          所有for循環,都可以改寫成while循環。上面的例子改為while循環,代碼如下。

          var x=3;var i=0;while (i < x) { console.log(i);
           i++;
          }
          

          for語句的三個部分(initialize、test、increment),可以省略任何一個,也可以全部省略。

          for ( ; ; ){ console.log('Hello World');
          }
          

          上面代碼省略了for語句表達式的三個部分,結果就導致了一個無限循環。

          7.3、do...while 循環

          do...while循環與while循環類似,唯一的區別就是先運行一次循環體,然后判斷循環條件。

          do
           語句while (條件);// 或者do {
           語句
          } while (條件);
          

          不管條件是否為真,do...while循環至少運行一次,這是這種結構最大的特點。另外,while語句后面的分號注意不要省略。

          下面是一個例子。

          var x=3;var i=0;do { console.log(i);
           i++;
          } while(i < x);
          


          7.4、break 語句和 continue 語句

          break語句和continue語句都具有跳轉作用,可以讓代碼不按既有的順序執行。

          break語句用于跳出代碼塊或循環。

          var i=0;while(i < 100) { console.log('i 當前為:' + i);
           i++; if (i===10) break;
          }
          

          上面代碼只會執行10次循環,一旦i等于10,就會跳出循環。

          for循環也可以使用break語句跳出循環。

          for (var i=0; i < 5; i++) { console.log(i); if (i===3) break;
          }// 0// 1// 2// 3
          

          上面代碼執行到i等于3,就會跳出循環。

          continue語句用于立即終止本輪循環,返回循環結構的頭部,開始下一輪循環。

          var i=0;while (i < 100){
           i++; if (i % 2===0) continue; console.log('i 當前為:' + i);
          }
          

          上面代碼只有在i為奇數時,才會輸出i的值。如果i為偶數,則直接進入下一輪循環。

          如果存在多重循環,不帶參數的break語句和continue語句都只針對最內層循環。

          7.5、標簽(label)

          JavaScript 語言允許,語句的前面有標簽(label),相當于定位符,用于跳轉到程序的任意位置,標簽的格式如下。

          label:
           語句
          

          標簽可以是任意的標識符,但不能是保留字,語句部分可以是任意語句。

          標簽通常與break語句和continue語句配合使用,跳出特定的循環。

          top: for (var i=0; i < 3; i++){ 
           for (var j=0; j < 3; j++){ 
           if (i===1 && j===1) break top; 
           console.log('i=' + i + ', j=' + j);
           }
           }// i=0, j=0// i=0, j=1// i=0, j=2// i=1, j=0
          

          上面代碼為一個雙重循環區塊,break命令后面加上了top標簽(注意,top不用加引號),滿足條件時,直接跳出雙層循環。如果break語句后面不使用標簽,則只能跳出內層循環,進入下一次的外層循環。

          標簽也可以用于跳出代碼塊。

          foo: { console.log(1); 
          break 
          foo; console.log('本行不會輸出');
          }console.log(2);// 1// 2
          

          上面代碼執行到break foo,就會跳出區塊。

          continue語句也可以與標簽配合使用。

          top: 
          for (var i=0; i < 3; i++){ 
          for (var j=0; j < 3; j++){ 
           if (i===1 && j===1) continue top; 
          console.log('i=' + i + ', j=' + j);
           }
           }
          // i=0, j=0
          // i=0, j=1
          // i=0, j=2
          // i=1, j=0
          // i=2, j=0
          // i=2, j=1
          // i=2, j=2
          

          上面代碼中,continue命令后面有一個標簽名,滿足條件時,會跳過當前循環,直接進入下一輪外層循環。如果continue語句后面不使用標簽,則只能進入下一輪的內層循環。

          推薦閱讀:

          「JavaScript 教程」入門篇-導論

          「JavaScript 教程」數據類型-數組

          「JavaScript 教程」數據類型-對象

          詳解 js 閉包(圖文版)

          js 中原型和原型鏈深入理解

          際開發中經常有根據請求參數來路由到不同請求處理者的情況,根據POST請求參數需要些nginx插件,這里主要簡單介紹下如何根據GET參數來路由。

          1、location進行路徑

          最常見的是通過location進行路徑匹配的時候,沒辦法是用正則表達一起捕獲這個路徑和querstring的。那么我想真的URL里面的Query String進行不同的rewrite,應該如何處理呢?答案就是$arg變量。

          Nginx里面$query_string 與$args相同,存儲了所提交的所有$query_string;比如&p=2887&q=test

          如果想要在nginx里面單獨訪問這些變量。可以這樣

          比如$p變量可以這樣訪問 $arg_p

          2、rewrite:

          需求用到rewrite 其中有一個是要把a.PHP?id=2重定向到b-2.html

          開始簡單的寫為

          rewrite "^/a(.*)?(.*)$" /b-.html permanent;

          總是不能正確的301到b-2.html

          查資料發現

          rewrite只能針對請求的uri進行重寫,/a.php問號后面的是請求參數,在nginx用$query_string表示,直接寫這樣的一條重寫肯定不會正確匹配,因為rewrite參數只會匹配請求的uri,在寫重寫的時候需要把$query_string變量追加到重寫的uri后面,為了防止uri中的參數追加到重寫后的uri,可以在后面加個問號:

          [html] view plain copy

          if ($query_string ~ "id=(.*)") {

          set $id ;

          rewrite ^/a.php$ /b-$id.html? permanent;

          }

          【示例1】

          比如我們希望訪問http://192.168.71.51:6061/do1.aspx?t=1212&c=uplog當url中的參數c為config或uplog的時候(忽略大小寫)我們路由到其他地方:

          下面是用這樣一個實例講述一下。

          首先增加一個upstream:

          [html] view plain copy

          ……

          upstream other {

          server 192.168.71.41:2210;

          }

          ……

          在location中加入判斷:

          [html] view plain copy

          ……

          location / {

          if ( $query_string ~* ^(.*)c=config\b|uplog\b(.*)$ ){

          proxy_pass http://other;

          }

          ……

          【示例2】

          要求是 如果請求中的$query_string包含"q=數字",301重新定向到首頁交由index.php處理。否則只是301重新定向到首頁。

          [html] view plain copy

          location ~* ^/wap/ {

          # if ( $http_user_agent ~* "(MSIE|bot|Spider|Slurp)" ) {

          # }

          if ($args ~* "p=\d+$") {

          rewrite ^ $scheme://$host/?p=$arg_p? permanent;

          }

          #Rewrite 后面帶一個?表示在重定向中使用query_tring

          rewrite ^/(.*)$ $scheme://$host/<del datetime="2012-01-24T14:18:20+00:00">?</del> permanent;

          }

          注:關于rewrite后面的問號,其作用是去除后面的qrerystring,不加?的話,就是這樣的比如原來的query_string是p=2887,不加問號的話 是重新定向到

          http://ihipop.info/?2887&p=2887 多了一個&p=2887這樣產生的 URI 不是很美觀。

          【示例3】

          [html] view plain copy

          location / {

          if ( $query_string ~* "p=\d+$" ) {

          proxy_pass http://www.ifeng.com;

          }

          proxy_pass http://www.baidu.com;

          }

          通過如上配置,當訪問nginx時,如果后面帶有p=數字的參數(http://10.153.140.42/?p=1),就會跳轉到ifeng,否則跳轉到baidu。

          示例4

          location / {

          index index.php index.html index.htm;

          try_files $uri $uri/ /index.php?$query_string;

          if ($arg_uatserver="test"){

          proxy_pass http://xxx.com;

          }

          if ( $query_string ~* "selftest+$" ){

          proxy_pass http://xxx.com;

          }

          }

          在nginx中有幾個關于uri的變量,包括$uri $request_uri $document_uri,下面看一下他們的區別 :

          $request_uri: /getinfo.php?id=25648&web_id=20123

          $uri /getinfo.php

          $document_uri: /getinfo.php


          主站蜘蛛池模板: 福利视频一区二区牛牛| 无码人妻久久久一区二区三区 | 国产品无码一区二区三区在线| 韩国理伦片一区二区三区在线播放 | 精品女同一区二区三区免费播放| 亚洲免费一区二区| 国产激情一区二区三区成人91| 最美女人体内射精一区二区| 无码精品人妻一区二区三区漫画| 日韩色视频一区二区三区亚洲| 国产午夜精品一区二区三区不卡| 亚洲福利一区二区精品秒拍| 一区二区三区在线免费| 国产一区二区三区影院| 香蕉免费看一区二区三区| 一区二区三区无码被窝影院| 国产亚洲3p无码一区二区| 91国偷自产一区二区三区| 国产一区二区内射最近更新| 国产一区二区三区无码免费| 亚洲av乱码一区二区三区按摩| 无码人妻AⅤ一区二区三区水密桃 无码欧精品亚洲日韩一区夜夜嗨 无码毛片一区二区三区中文字幕 无码毛片一区二区三区视频免费播放 | 国产成人综合精品一区| 精品国产免费观看一区| 国产在线乱子伦一区二区| 人妻少妇精品视频一区二区三区 | 中文字幕一区二区三区精彩视频| 国产丝袜无码一区二区三区视频| 日韩精品一区二区三区中文字幕 | 在线电影一区二区| 国产一区二区好的精华液| 精品国产一区二区三区不卡| 91在线一区二区| 亚洲国产高清在线精品一区| 精品一区二区三区在线成人| 乱精品一区字幕二区| 制服丝袜一区在线| 亚洲av色香蕉一区二区三区蜜桃 | 2021国产精品视频一区| 欲色aV无码一区二区人妻| 国产精品无码亚洲一区二区三区|