http://eyesmore.iteye.com/blog/1141660
http://iteye.com/eyesmore/
æäºç«¥éç误åº
1ã location çå¹é 顺åºæ¯âå å¹é æ£åï¼åå¹é æ®éâã
ç«æ£ï¼Â location çå¹é 顺åºå ¶å®æ¯âå å¹é æ®éï¼åå¹é æ£åâãæè¿ä¹è¯´ï¼å¤§å®¶ä¸å®ä¼å驳æï¼å 为æâå å¹é æ®éï¼åå¹é æ£åâ解éä¸äºå¤§å®¶å¹³æ¶ä¹ æ¯çæâå å¹é æ£åï¼åå¹é æ®éâçå®è·µç»éªãè¿éæåªè½ææ¶è§£éä¸ï¼é æè¿ç§è¯¯è§£çåå æ¯ï¼æ£åå¹é ä¼è¦çæ®éå¹é ï¼å®é çè§åï¼æ¯è¿å¤æï¼åé¢ä¼è¯¦ç»è§£éï¼ã
Â
2ã location çæ§è¡é»è¾è·Â location çç¼è¾é¡ºåºæ å ³ã
ç«æ£ï¼è¿å¥è¯ä¸å ¨å¯¹ï¼âæ®é location âçå¹é è§åæ¯âæ大åç¼âï¼å æ¤âæ®é location âçç¡®ä¸Â location ç¼è¾é¡ºåºæ å ³ï¼ä½æ¯âæ£å location âçå¹é è§åæ¯â顺åºå¹é ï¼ä¸åªè¦å¹é å°ç¬¬ä¸ä¸ªå°±åæ¢åé¢çå¹é âï¼âæ®élocation âä¸âæ£å location âä¹é´çå¹é 顺åºæ¯ï¼å å¹é æ®é location ï¼åâèèâå¹é æ£å location ã注æè¿éçâèèâæ¯âå¯è½âçææï¼ä¹å°±æ¯è¯´å¹é å®âæ®é location âåï¼æçæ¶åéè¦ç»§ç»å¹é âæ£å location âï¼æçæ¶ååä¸éè¦ç»§ç»å¹é âæ£å location âã两ç§æ åµä¸ï¼ä¸éè¦ç»§ç»å¹é æ£å location ï¼ï¼Â 1 ï¼å½æ®é location åé¢æå®äºâ ^~ âï¼ç¹å«åè¯Â Nginx æ¬æ¡æ®é location ä¸æ¦å¹é ä¸ï¼åä¸éè¦ç»§ç»æ£åå¹é ï¼ï¼Â 2 ï¼å½æ®élocation æ°å¥½ä¸¥æ ¼å¹é ä¸ï¼ä¸æ¯æ大åç¼å¹é ï¼åä¸å继ç»å¹é æ£åã
Â
æ»ç»ä¸å¥è¯ï¼  âæ£å location å¹é 让æ¥æ®é location çä¸¥æ ¼ç²¾ç¡®å¹é ç»æï¼ä½è¦çæ®é location çæ大åç¼å¹é ç»æâ
Â
Â
å®æ¹æ档解é
REFER:Â Â http://wiki.nginx.org/NginxHttpCoreModule#location
Â
location
syntax:Â location [=|~|~*|^~|@] /uri/ { ... }
default:Â no
context:Â server
This directive allows different configurations depending on the URI.
ï¼è¯è 注ï¼1 ãdifferent configurations depending on the URI 说çå°±æ¯è¯æ³æ ¼å¼ï¼location [=|~|~*|^~|@] /uri/ { ... } ï¼ä¾æ®ä¸åçåç¼â= âï¼â^~ âï¼â~ âï¼â~* âåä¸å¸¦ä»»ä½åç¼çï¼å 为[A] 表示å¯éï¼å¯ä»¥ä¸è¦çï¼ï¼è¡¨è¾¾ä¸åçå«ä¹, ç®åç说尽管location ç/uri/ é ç½®ä¸æ ·ï¼ä½åç¼ä¸ä¸æ ·ï¼è¡¨è¾¾çæ¯ä¸åçæ令å«ä¹ã2 ãæ¥è¯¢å符串ä¸å¨URIèå´å ãä¾å¦ï¼/films.htm?fid=123 çURI æ¯/films.htm ãï¼
It can be configured using both literal strings and regular expressions. To use regular expressions, you must use a prefix:
- "~" for case sensitive matching
- "~*" for case insensitive matching
è¯æï¼ä¸æ讲å°location /uri/ å¯éè¿ä½¿ç¨ä¸åçåç¼ï¼è¡¨è¾¾ä¸åçå«ä¹ã对è¿äºä¸ååç¼ï¼åä¸ç±»ï¼å°±2 大类ï¼æ£ålocation ï¼è±æ说æ³æ¯location using regular expressions åæ®élocation ï¼è±æ说æ³æ¯location using literal strings ãé£ä¹å ¶ä¸â~ âåâ~* âåç¼è¡¨ç¤ºæ£ålocation ï¼â~ âåºå大å°åï¼â~* âä¸åºå大å°åï¼å ¶ä»åç¼ï¼å æ¬ï¼â=âï¼â^~ âåâ@ âï¼åæ ä»»ä½åç¼çé½å±äºæ®élocation ã
To determine which location directive matches a particular query, the literal strings are checked first.
è¯æï¼å¯¹äºä¸ä¸ªç¹å®ç HTTP 请æ±ï¼Â a particular query ï¼ï¼Â nginx åºè¯¥å¹é åªä¸ªÂ location åçæ令å¢ï¼æ³¨æï¼æ们å¨Â nginx.conf é ç½®æ件éé¢ä¸è¬ä¼å®ä¹å¤ä¸ªÂ location çï¼ï¼å¹é  è§åæ¯ï¼å å¹é æ®élocation ï¼åå¹é æ£å表达å¼ï¼ã注æï¼å®æ¹ææ¡£è¿å¥è¯å°±æ确说äºï¼å æ®élocation ï¼èä¸æ¯æäºåå¦ç误åºâå å¹é æ£ålocation âã
Literal strings match the beginning portion of the query - the most specific match will be used.
åé¢è¯´äºâæ®élocation âä¸âæ£ålocation âä¹é´çå¹é è§åæ¯ï¼å å¹é æ®élocation ï¼åå¹é æ£ålocation ãé£ä¹ï¼âæ®élocation âå é¨ï¼æ®élocation ä¸æ®élocation ï¼æ¯å¦ä½å¹é çå¢ï¼ç®åç说ï¼æ大åç¼å¹é ãåæï¼1ãmatch the beginning portion of the query ï¼è¯´çæ¯å¹é URI çåç¼é¨åbeginning portion ï¼ï¼Â 2 ãthe most specific match will be used ï¼å 为location ä¸æ¯âä¸¥æ ¼å¹é âï¼èæ¯âåç¼å¹é âï¼å°±ä¼äº§çä¸ä¸ªHTTP 请æ±ï¼å¯ä»¥âåç¼å¹é âå°å¤ä¸ªæ®élocation ï¼ä¾å¦ï¼location /prefix/mid/ {} ålocation /prefix/ {} ï¼å¯¹äºHTTP 请æ±/prefix/mid/t.html ï¼åç¼å¹é çè¯ä¸¤ä¸ªlocation é½æ»¡è¶³ï¼éåªä¸ªï¼ååæ¯ï¼the most specific match ï¼äºæ¯éçæ¯location /prefix/mid/ {} ï¼ã
Afterwards, regular expressions are checked in the order defined in the configuration file. The first regular expression to match the query will stop the search.
è¿æ®µè¯è¯´äºä¸¤å±ææï¼ç¬¬ä¸å±æ¯ï¼âAfterwards, regular expressions are checked â, æææ¯æ®élocation å å¹é ï¼èä¸éæ©äºæ大åç¼å¹é åï¼ä¸è½å°±åæ¢åé¢çå¹é ï¼æ大åç¼å¹é åªæ¯ä¸ä¸ªä¸´æ¶çç»æï¼nginx è¿éè¦ç»§ç»æ£æ¥æ£ålocation ï¼ä½è³äºæç»æè½æ®élocation çæ大åç¼å¹é ï¼è¿æ¯æ£ålocation çå¹é ï¼æªæ¢å½åçå 容è¿æ²¡è®²ï¼ä½åé¢ä¼è®²ï¼ã第äºå±æ¯âregular expressions are checked in the order defined in the configuration file. The first regular expression to match the query will stop the search. âï¼æææ¯è¯´âæ£ålocation âä¸âæ£ålocationâå é¨çå¹é è§åæ¯ï¼æç §æ£ålocation å¨é ç½®æ件ä¸çç©ç顺åºï¼ç¼è¾é¡ºåºï¼å¹é çï¼è¿å¥è¯å°±è¯´ælocation 并ä¸æ¯ä¸å®è·é¡ºåºæ å ³ï¼åªæ¯æ®élocation ä¸é¡ºåºæ å ³ï¼æ£ålocation è¿æ¯ä¸é¡ºåºæå ³çï¼ï¼å¹¶ä¸åªè¦å¹é å°ä¸æ¡æ£ålocation ï¼å°±ä¸åèèåé¢çï¼è¿ä¸âæ®élocation âä¸âæ£ålocation âä¹é´çè§åä¸ä¸æ ·ï¼âæ®élocation âä¸âæ£ålocation âä¹é´çè§åæ¯ï¼éæ©åºâæ®élocation âçæ大åç¼å¹é ç»æåï¼è¿éè¦ç»§ç»æç´¢æ£ålocation ï¼ã
If no regular expression matches are found, the result from the literal string search is used.
è¿å¥è¯åçäºâæ®élocation âçæ大åç¼å¹é ç»æä¸ç»§ç»æç´¢çâæ£ålocation âå¹é ç»æçå³çå ³ç³»ãå¦æ继ç»æç´¢çâæ£ålocation âä¹æå¹é ä¸çï¼é£ä¹âæ£ålocation âè¦ç âæ®élocation âçæ大åç¼å¹é ï¼å 为æè¿ä¸ªè¦çå ³ç³»ï¼æ以é ææäºåå¦ä»¥ä¸ºæ£ålocation å äºæ®élocation æ§è¡çé误ç解ï¼ï¼ä½æ¯å¦æâæ£ålocation â没æè½å¹é ä¸ï¼é£ä¹å°±ç¨âæ®élocation âçæ大åç¼å¹é ç»æã
For case insensitive operating systems, like Mac OS X or Windows with Cygwin, literal string matching is done in a case insensitive way (0.7.7). However, comparison is limited to single-byte locale's only.
Regular expression may contain captures (0.7.40), which can then be used in other directives.
It is possible to disable regular expression checks after literal string matching by using "^~" prefix. If the most specific match literal location has this prefix: regular expressions aren't checked.
é常çè§åæ¯ï¼å¹é å®äºâæ®élocation âæ令ï¼è¿éè¦ç»§ç»å¹é âæ£ålocation âï¼ä½æ¯ä½ ä¹å¯ä»¥åè¯Nginx ï¼å¹é å°äºâæ®élocation âåï¼ä¸åéè¦ç»§ç»å¹é âæ£ålocation âäºï¼è¦åå°è¿ä¸ç¹åªè¦å¨âæ®élocation âåé¢å ä¸â^~ â符å·ï¼^ 表示âéâï¼~ 表示âæ£åâï¼å符æææ¯ï¼ä¸è¦ç»§ç»å¹é æ£åï¼ã
By using the "=" prefix we define the exact match between request URI and location. When matched search stops immediately. E.g., if the request "/" occurs frequently, using "location = /" will speed up processing of this request a bit as search will stop after first comparison.
é¤äºä¸æçâ^~ âå¯ä»¥é»æ¢ç»§ç»æç´¢æ£ålocation å¤ï¼ä½ è¿å¯ä»¥å â= âãé£ä¹å¦æâ^~ âåâ= âé½è½é»æ¢ç»§ç»æç´¢æ£ålocation çè¯ï¼é£å®ä»¬ä¹é´æä»ä¹åºå«å¢ï¼åºå«å¾ç®åï¼å ±åç¹æ¯å®ä»¬é½è½é»æ¢ç»§ç»æç´¢æ£ålocation ï¼ä¸åç¹æ¯â^~ âä¾ç¶éµå®âæ大åç¼âå¹é è§åï¼ç¶èâ= âä¸æ¯âæ大åç¼âï¼èæ¯å¿ é¡»æ¯ä¸¥æ ¼å¹é ï¼exact match ï¼ã
è¿é顺便讲ä¸âlocation / {} âåâlocation = / {} âçåºå«ï¼âlocation / {} âéµå®æ®élocation çæ大åç¼å¹é ï¼ç±äºä»»ä½URI é½å¿ ç¶ä»¥â/ âæ ¹å¼å¤´ï¼æ以对äºä¸ä¸ªURI ï¼å¦æææ´specific çå¹é ï¼é£èªç¶æ¯éè¿ä¸ªæ´specific çï¼å¦æ没æï¼â/ âä¸å®è½ä¸ºè¿ä¸ªURI å«èï¼è³å°è½å¹é å°â/ âï¼ï¼ä¹å°±æ¯è¯´âlocation / {} âæç¹é»è®¤é ç½®çå³éï¼å ¶ä»æ´specificçé ç½®è½è¦çoverwrite è¿ä¸ªé»è®¤é ç½®ï¼è¿ä¹æ¯ä¸ºä»ä¹æ们æ»è½çå°location / {} è¿ä¸ªé ç½®çä¸ä¸ªå¾éè¦çåå ï¼ãèâlocation = / {} âéµå®çæ¯âä¸¥æ ¼ç²¾ç¡®å¹é exact match âï¼ä¹å°±æ¯åªè½å¹é  http://host:port/ 请æ±ï¼åæ¶ä¼ç¦æ¢ç»§ç»æç´¢æ£ålocation ãå æ¤å¦ææ们åªæ³å¯¹âGET / â请æ±é ç½®ä½ç¨æ令ï¼é£ä¹æ们å¯ä»¥éâlocation = / {} âè¿æ ·è½åå°æ£ålocation çæç´¢ï¼å æ¤æçæ¯âlocation / {}â é«ï¼æ³¨ï¼åææ¯æ们çç®çä» ä» åªæ³å¯¹âGET / âèµ·ä½ç¨ï¼ã
On exact match with literal location without "=" or "^~" prefixes search is also immediately terminated.
åé¢æ们说äºï¼æ®élocation å¹é å®åï¼è¿ä¼ç»§ç»å¹é æ£ålocation ï¼ä½æ¯nginx å è®¸ä½ é»æ¢è¿ç§è¡ä¸ºï¼æ¹æ³å¾ç®åï¼åªéè¦å¨æ®élocation åå â^~ âæâ= âãä½å ¶å®è¿æä¸ç§âéå«âçæ¹å¼æ¥é»æ¢æ£ålocation çæç´¢ï¼è¿ç§éå«çæ¹å¼å°±æ¯ï¼å½âæ大åç¼âå¹é æ°å¥½å°±æ¯ä¸ä¸ªâä¸¥æ ¼ç²¾ç¡®ï¼exact match ï¼âå¹é ï¼ç §æ ·ä¼åæ¢åé¢çæç´¢ãåæåé¢æææ¯ï¼åªè¦éå°â精确å¹é exact match âï¼å³ä½¿æ®élocation 没æ带â= âæâ^~ âåç¼ï¼ä¹ä¸æ ·ä¼ç»æ¢åé¢çå¹é ã
å 举ä¾è§£éä¸ï¼åé¢ä¾é¢ä¼ç¨å®è·µåè¯å¤§å®¶ãå设å½åé ç½®æ¯ï¼location /exact/match/test.html { é ç½®æ令å1}ï¼location /prefix/ { é ç½®æ令å2} å location ~ \.html$ { é ç½®æ令å3} ï¼å¦ææ们请æ±Â GET /prefix/index.html ï¼åä¼è¢«å¹é å°æ令å3 ï¼å 为æ®élocation /prefix/ ä¾æ®æ大å¹é ååè½å¹é å½å请æ±ï¼ä½æ¯ä¼è¢«åé¢çæ£ålocation è¦çï¼å½è¯·æ±GET /exact/match/test.html ï¼ä¼å¹é å°æ令å1 ï¼å 为è¿ä¸ªæ¯æ®élocation çexact match ï¼ä¼ç¦æ¢ç»§ç»æç´¢æ£ålocation ã
To summarize, the order in which directives are checked is as follows:
- Directives with the "=" prefix that match the query exactly. If found, searching stops.
- All remaining directives with conventional strings. If this match used the "^~" prefix, searching stops.
- Regular expressions, in the order they are defined in the configuration file.
- If #3 yielded a match, that result is used. Otherwise, the match from #2 is used.
è¿ä¸ªé¡ºåºæ²¡å¿ è¦åè¿å¤è§£éäºãä½ææ³ç¨èªå·±çè¯æ¦æ¬ä¸ä¸é¢çææâæ£å location å¹é 让æ¥æ®é locationçä¸¥æ ¼ç²¾ç¡®å¹é ç»æï¼ä½è¦çæ®é location çæ大åç¼å¹é ç»æâã
It is important to know that nginx does the comparison against decoded URIs. For example, if you wish to match "/images/%20/test", then you must use "/images/ /test" to determine the location.
å¨æµè§å¨ä¸æ¾ç¤ºçURL ä¸è¬é½ä¼è¿è¡URLEncode ï¼ä¾å¦âç©ºæ ¼âä¼è¢«ç¼ç 为%20 ï¼ä½æ¯Nginx çURL çå¹é é½æ¯é对URLDecode ä¹åçãä¹å°±æ¯è¯´ï¼å¦æä½ è¦å¹é â/images/%20/test âï¼ä½ ålocation çæ¶åå¹é ç®æ åºè¯¥æ¯ï¼â/images/ /test âã
Example:
location   = / {
  # matches the query / only.
  [ configuration A ]
}
location   / {
  # matches any query, since all queries begin with /, but regular
  # expressions and any longer conventional blocks will be
  # matched first.
  [ configuration B ]
}
location ^~ /images/ {
    # matches any query beginning with /images/ and halts searching,
  # so regular expressions will not be checked.
  [ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
  # matches any request ending in gif, jpg, or jpeg. However, all
  # requests to the /images/ directory will be handled by
  # Configuration C. Â
  [ configuration D ]
}
Â
ä¸è¿°è¿4 个location çé ç½®ï¼æ²¡ä»ä¹å¥½è§£éçï¼å¯ä¸éè¦è¯´æçæ¯location / {[configuration B]} ï¼åæç注éä¸¥æ ¼æ¥è¯´æ¯é误çï¼ä½æç¸ä¿¡åæä½è æ¯äºè§£è§åçï¼åªæ¯æåæè¿°ä¸ç®åäºä¸ï¼ä½è¿ä¸ªç®å容æç»è¯»è é æâ误解ï¼å æ£æ¥æ£ålocation ï¼åæ£æ¥æ®élocation âãåæï¼âmatches any query, since all queries begin with /, but regular expressions and any longer conventional blocks will be matched first. â大ææ¯è¯´ï¼âlocation / {} è½å¤å¹é ææHTTP 请æ±ï¼å 为任ä½HTTP 请æ±é½å¿ ç¶æ¯ä»¥â/ âå¼å§çï¼è¿åå¥æ²¡æé误ï¼ãä½æ¯ï¼æ£ålocation åå ¶ä»ä»»ä½æ¯â/ âæ´é¿çæ®élocation ï¼location / {} æ¯æ®élocation éé¢æççï¼å æ¤å ¶ä»ä»»ä½æ®élocation é½ä¼æ¯å®æ´é¿ï¼å½ç¶location = / {} å location ^~ / {} æ¯ä¸æ ·é¿çï¼ä¼ä¼å å¹é ï¼matched first ï¼ãâ åæä½è 说â but regular expressions will be matched first. âåºè¯¥åªæ¯æ³è¯´æ£å location ä¼è¦çè¿éç location / {} ï¼ä½ä¾ç¶æ¯æ®élocation / {} å äºæ£å location å¹é ï¼æ¥çåæ£å location å¹é ï¼ä½å ¶ä»æ´é¿çæ®é location ï¼Â any longer conventional blocks ï¼çç¡®ä¼å äºÂ location / {} å¹é ã
Â
Example requests:
- / -> configuration A
- /documents/document.html -> configuration B
- /images/1.gif -> configuration C
- /documents/1.jpg -> configuration D
Note that you could define these 4 configurations in any order and the results would remain the same.
éè¦æéä¸ï¼è¿é说âin any order âåâ⦠remain the same âæ¯å 为ä¸é¢åªæä¸ä¸ªæ£ålocation ãæç« åé¢å·²ç»è¯´äºæ£ålocation çå¹é æ¯è·ç¼è¾é¡ºåºæå ³ç³»çã
While nested locations are allowed by the configuration file parser, their use is discouraged and may produce unexpected results.
å®é ä¸Â nginx çé ç½®æ件解æç¨åºæ¯å 许 location åµå¥å®ä¹çï¼Â location / { location /uri/ {} } ï¼ãä½æ¯æ们平æ¶å´å¾å°çè§è¿æ ·çé ç½®ï¼é£æ¯å 为 nginx å®æ¹å¹¶ä¸å»ºè®®å¤§å®¶è¿ä¹åï¼å 为è¿æ ·ä¼å¯¼è´å¾å¤ææ³ä¸å°çåæã
The prefix "@" specifies a named location. Such locations are not used during normal processing of requests, they are intended only to process internally redirected requests (see error_page , try_files ).
æç« å¼å§è¯´äºlocation çè¯æ³ä¸ï¼å¯ä»¥æâ= âï¼â^~ âï¼â~ âåâ~* âåç¼ï¼æè å¹²è没æä»»ä½åç¼ï¼è¿æâ@ âåç¼ï¼ä½æ¯åé¢çåææ们å§ç»æ²¡æè°å°â@ âåç¼ãæç« æåç¹å 容ï¼ä»ç»äºâï¼ âçç¨éï¼â@ âæ¯ç¨æ¥å®ä¹âNamed Location âçï¼ä½ å¯ä»¥ç解为ç¬ç«äºâæ®élocation ï¼location using literal strings ï¼âåâæ£ålocation ï¼location using regular expressions ï¼âä¹å¤ç第ä¸ç§ç±»åï¼ï¼è¿ç§âNamed Location âä¸æ¯ç¨æ¥å¤çæ®éçHTTP 请æ±çï¼å®æ¯ä¸é¨ç¨æ¥å¤çâå é¨éå®åï¼internally redirected ï¼â请æ±çã注æï¼è¿é说çâå é¨éå®åï¼internally redirected ï¼âæ许说æâforward âä¼å¥½ç¹ï¼ä»¥ä¸ºå internally redirected æ¯ä¸éè¦è·æµè§å¨äº¤äºçï¼çº¯ç²¹æ¯æå¡ç«¯çä¸ä¸ªè½¬åè¡ä¸ºã
Â
å®è£ Nginx
wget http://nginx.org/download/nginx-1.1.0.tar.gz
tar zxvf nginx-1.1.0.tar.gz
./configure
make
make install
éè¦æ³¨æçæ¯å¨Â configure è¿æ¥éå°ç¹å°éº»ç¦ï¼
./configure: error: the HTTP rewrite module requires the PCRE library.
å®è£  nginx çæ¶åï¼Â rewrite 模åé»è®¤æ¯éè¦è¢«å®è£ çãä½æ¯Â rewrite 模åæä¾èµç PCRE åºéè¦é¢å¤å®è£ ã
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
Â
解å³åæ³ï¼Â http://apps.hi.baidu.com/share/detail/34331473
å æ§è¡ï¼Â yum -y install pcre-devel openssl openssl-devel  æä¾èµçä¸è¥¿å®è£ ä¸ã
Â
å¤æ³¨ï¼Â PCRE (Perl Compatible Regular Expressions )æ¯perlè¯è¨æ£å表达å¼ã Nginxçrewriteçæ£å表达å¼éç¨çæ¯Perlè¯æ³éï¼å¸¸è¯ï¼æ£å表达å¼æä¸åçè¯æ³éï¼æ们常è§çgrepæ令å¦æéè¦éç¨Perlè¯æ³éï¼éè¦grep -P æ¥æå®ï¼ã
Â
location å®ä¾ç»ä¹
Nginx çè¯æ³å½¢å¼æ¯ï¼Â location [=|~|~*|^~|@] /uri/ { ... } ï¼æææ¯å¯ä»¥ä»¥â = âæâ ~* âæâ ~ âæâ ^~ âæâ @ â符å·ä¸ºåç¼ï¼å½ç¶ä¹å¯ä»¥æ²¡æåç¼ï¼å 为 [A] æ¯è¡¨ç¤ºå¯éç A ï¼Â A|B 表示 A å B éä¸ä¸ªï¼ï¼ç´§æ¥çæ¯Â /uri/ ï¼åæ¥çæ¯{â¦} æ令åï¼æ´ä¸ªæææ¯å¯¹äºæ»¡è¶³è¿æ ·æ¡ä»¶ç /uri/ éç¨æ令å {â¦} çæ令ã
ä¸è¿°åç§Â location å¯å两大类ï¼åå«æ¯ï¼âæ®é location âï¼å®æ¹è±æ说æ³æ¯Â location using   literal strings åâæ£å location âï¼è±æ说æ³æ¯Â location using regular expressions ãå ¶ä¸âæ®é location âæ¯ä»¥â = âæâ ^~ â为åç¼æè 没æä»»ä½åç¼ç /uri/ ï¼âæ£å location âæ¯ä»¥â ~ âæâ ~* â为åç¼ç /uri/ ã
é£ä¹ï¼å½æ们å¨ä¸ä¸ªÂ server ä¸ä¸æç¼åäºå¤ä¸ªÂ location çæ¶åï¼Â Nginx 对äºä¸ä¸ªÂ HTTP 请æ±ï¼æ¯å¦ä½å¹é å°ä¸ä¸ªÂ location åå¤çå¢ï¼ç¨ä¸å¥è¯ç®åæ¦æ¬Â Nginx ç location å¹é è§åæ¯ï¼âæ£å location â让æ¥Â âæ®é locationâçä¸¥æ ¼ç²¾ç¡®å¹é ç»æï¼ä½è¦ç âæ®é location âçæ大åç¼å¹é ç»æãç解è¿å¥è¯ï¼ææ³éè¿ä¸é¢çå®ä¾æ¥è¯´æã
#1 å æ®é location ï¼åæ£å location
å¨è¾¹ä¸å°ç«¥éåè¯æï¼Â nginx æ¯âå å¹é æ£å location åå¹é æ®é location âï¼å ¶å®è¿æ¯ä¸ä¸ªè¯¯åºï¼Â nginxÂ å ¶å®æ¯âå å¹é æ®é location ï¼åå¹é æ£å location âï¼ä½æ¯æ®é location çå¹é ç»æåå两ç§ï¼ä¸ç§æ¯âä¸¥æ ¼ç²¾ç¡®å¹é âï¼å®æ¹è±æ说æ³æ¯â exact match âï¼å¦ä¸ç§æ¯âæ大åç¼å¹é âï¼å®æ¹è±æ说æ³æ¯â Literal strings match the beginning portion of the query - the most specific match will be used. âãæ们å个å®éªï¼
Â
ä¾é¢Â 1 ï¼å设 nginx çé ç½®å¦ä¸
server {
        listen       9090;
        server_name  localhost;
                   location / {
            root   html;
            index  index.html index.htm;
            deny all;
        }
        location ~ \.html$ {
            allow all;
        }
}
éå½Â nginx çç®å½ç»ææ¯ï¼Â nginx->html->index.html
ä¸è¿°é ç½®çæææ¯ï¼Â location / {⦠deny all;} æ®é location 以â / âå¼å§ç URI 请æ±ï¼æ³¨æä»»ä½Â HTTP 请æ±é½å¿ ç¶ä»¥â / âå¼å§ï¼æ以â / âçæææ¯ææç请æ±é½è½è¢«å¹é ä¸ï¼ï¼é½æç»è®¿é®ï¼Â location ~\.html$ {allow all;} æ£ålocation 以 .html ç»å°¾ç URI 请æ±ï¼é½å 许访é®ã
Â
æµè¯ç»æï¼
[[email protected] ~]# curl http://localhost:9090/
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.1.0</center>
</body>
</html>
[[email protected] ~]# curl http://localhost:9090/index.html
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>
</body>
</html>
[[email protected] ~]# curl http://localhost:9090/index_notfound.html
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.1.0</center>
</body>
</html>
[[email protected] ~]#
Â
æµè¯ç»æå¦ä¸ï¼
URIÂ è¯·æ± | HTTP ååº |
curl http://localhost:9090/ | 403 Forbidden |
curl http://localhost:9090/index.html | Welcome to nginx! |
curl http://localhost:9090/index_notfound.html | 404 Not Found |
Â
curl http://localhost:9090/ çç»ææ¯â 403 Forbidden âï¼è¯´æ被å¹é å°â location / {..deny all;} âäºï¼åå å¾ç®åHTTP 请æ±Â GET / 被âä¸¥æ ¼ç²¾ç¡®âå¹é å°äºæ®é location / {} ï¼åä¼åæ¢æç´¢æ£å location ï¼
curl http://localhost:9090/index.html ç»ææ¯â Welcome to nginx! âï¼è¯´æ没æ被â location / {â¦deny all;} âå¹é ï¼å¦åä¼Â 403 Forbidden ï¼ä½Â /index.html çç¡®ä¹æ¯ä»¥â / âå¼å¤´çï¼åªä¸è¿æ¤æ¶çæ®é location / çå¹é ç»ææ¯âæ大åç¼âå¹é ï¼æ以 Nginx ä¼ç»§ç»æç´¢æ£å location ï¼Â location ~ \.html$ 表达äºä»¥Â .html ç»å°¾çé½Â allow all; äºæ¯æ¥ç就访é®å°äºå®é åå¨ç index.html 页é¢ã
curl http://localhost:9090/index_notfound.html   åæ ·çéçå å¹é  location / {} ï¼ä½å±äºâæ®é location çæ大åç¼å¹é âï¼äºæ¯åé¢è¢«âæ£å location â location ~ \.html$ {} è¦çäºï¼æç»Â allow all ï¼Â ä½çç¡®ç®å½ä¸ä¸åå¨index_notfound.html 页é¢ï¼äºæ¯Â 404 Not Found ã
Â
å¦ææ¤æ¶æ们访é®Â http://localhost:9090/index.txt ä¼æ¯ä»ä¹ç»æå¢ï¼æ¾ç¶æ¯Â deny all ï¼å 为å å¹é ä¸äºÂ location / {..deny all;} 尽管å±äºâæ®é location âçæ大åç¼å¹é ç»æï¼ç»§ç»æç´¢æ£å location ï¼ä½æ¯Â /index.txt ä¸æ¯ä»¥Â .htmlç»å°¾çï¼æ£å location 失败ï¼æç»é纳æ®é location çæ大åç¼å¹é ç»æï¼äºæ¯Â deny all äºã
[[email protected] ~]# curl http://localhost:9090/index.txt
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.1.0</center>
</body>
</html>
[[email protected] ~]#
#2 æ®é location çâéå¼âä¸¥æ ¼å¹é
ä¾é¢Â 2 ï¼æ们å¨ä¾é¢Â 1 çåºç¡ä¸å¢å 精确é ç½®
Â
server {
        listen       9090;
        server_name  localhost;
                   location /exact/match.html {
            allow all;
        }
                   location / {
            root   html;
            index  index.html index.htm;
            deny all;
        }
        location ~ \.html$ {
            allow all;
        }
}
Â
æµè¯è¯·æ±ï¼
[[email protected] ~]# curl http://localhost:9090/exact/match.html
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.1.0</center>
</body>
</html>
[[email protected] ~]#
Â
ç»æè¿ä¸æ¥éªè¯äºâæ®é location âçâä¸¥æ ¼ç²¾ç¡®âå¹é ä¼ç»æ¢å¯¹æ£å location çæç´¢ãè¿éæ们å°ç»ä¸âæ®é locationâä¸âæ£å location âçå¹é è§åï¼å å¹é æ®é location ï¼åå¹é æ£å location ï¼ä½æ¯å¦ææ®é location çå¹é ç»ææ°å¥½æ¯âä¸¥æ ¼ç²¾ç¡®ï¼Â exact match ï¼âçï¼å nginx ä¸åå°è¯åé¢çæ£å location ï¼å¦ææ®é location çå¹é ç»ææ¯âæ大åç¼âï¼åæ£å location çå¹é è¦çæ®é location çå¹é ãä¹å°±æ¯åé¢è¯´çâæ£å location 让æ¥æ®élocation çä¸¥æ ¼ç²¾ç¡®å¹é ç»æï¼ä½è¦çæ®é location çæ大åç¼å¹é ç»æâã
#3 æ®é location çâæ¾å¼âä¸¥æ ¼å¹é åâ ^~ â åç¼
ä¸é¢æ们æ¼ç¤ºçæ®é location é½æ¯ä¸å ä»»ä½åç¼çï¼å ¶å®æ®é location ä¹å¯ä»¥å åç¼ï¼â ^~ âåâ = âãå ¶ä¸â^~ âçæææ¯âéæ£åï¼ä¸éè¦ç»§ç»æ£åå¹é âï¼ä¹å°±æ¯é常æ们çæ®é location ï¼è¿ä¼ç»§ç»æç´¢æ£å location ï¼æ°å¥½ä¸¥æ ¼ç²¾ç¡®å¹é é¤å¤ï¼ï¼ä½æ¯Â nginx å¾äººæ§åå 许é 置人ååè¯Â nginx ææ¡æ®é location ï¼æ 论æ大åç¼å¹é ï¼è¿æ¯ä¸¥æ ¼ç²¾ç¡®å¹é é½ç»æ¢ç»§ç»æç´¢æ£å location ï¼èâ = âå表达çæ¯æ®é location ä¸å 许âæ大åç¼âå¹é ç»æï¼å¿ é¡»ä¸¥æ ¼çäºï¼ä¸¥æ ¼ç²¾ç¡®å¹é ã
Â
ä¾é¢Â 3 ï¼â ^~ âåç¼ç使ç¨
server {
        listen       9090;
        server_name  localhost;
                   location /exact/match.html {
            allow all;
        }
                  location ^~ / {
            root   html;
            index  index.html index.htm;
            deny all;
        }
        location ~ \.html$ {
            allow all;
        }
}
Â
æä¾é¢Â 2 ä¸ç location / {} 修æ¹æ location ^~ / {} ï¼åççæµè¯ç»æï¼
URIÂ è¯·æ± | ä¿®æ¹å | ä¿®æ¹å |
curl http://localhost:9090/ | 403 Forbidden | 403 Forbidden |
curl http://localhost:9090/index.html | Welcome to nginx! | 403 Forbidden |
curl http://localhost:9090/index_notfound.html | 404 Not Found | 403 Forbidden |
curl http://localhost:9090/exact/match.html | 404 Not Found | 404 Not Found |
Â
é¤äºÂ GET /exact/match.html æ¯Â 404 Not Found ï¼å ¶ä½é½æ¯Â 403 Forbidden ï¼åå å¾ç®åææ请æ±é½æ¯ä»¥â / âå¼å¤´ï¼æ以ææ请æ±é½è½å¹é ä¸â / âæ®é location ï¼ä½æ®é location çå¹é ååæ¯âæ大åç¼âï¼æ以åªæ/exact/match.html å¹é å°Â location /exact/match.html {allow all;} ï¼å ¶ä½é½Â location ^~ / {deny all;} 并ç»æ¢æ£åæç´¢ã
Â
ä¾é¢Â 4 ï¼â = âåç¼ç使ç¨
server {
        listen       9090;
        server_name  localhost;
                   location /exact/match.html {
            allow all;
        }
                  location = / {
            root   html;
            index  index.html index.htm;
            deny all;
        }
        location ~ \.html$ {
            allow all;
        }
}
ä¾é¢Â 4 ç¸å¯¹ä¾é¢Â 2 æ location / {} 修æ¹æäºÂ location = / {} ï¼å次æµè¯ç»æï¼
URIÂ è¯·æ± | ä¿®æ¹å | ä¿®æ¹å |
curl http://localhost:9090/ | 403 Forbidden | 403 Forbidden |
curl http://localhost:9090/index.html | Welcome to nginx! | Welcome to nginx! |
curl http://localhost:9090/index_notfound.html | 404 Not Found | 404 Not Found |
curl http://localhost:9090/exact/match.html | 404 Not Found | 404 Not Found |
curl http://localhost:9090/test.jsp | 403 Forbidden | 404 Not Found |
Â
æè½è¯´æé®é¢çæµè¯æ¯Â GET /test.jsp ï¼å®é ä¸Â /test.jsp 没æå¹é æ£å location ï¼Â location ~\.html$ ï¼ï¼ä¹æ²¡æå¹é  location = / {} ï¼å¦ææç §Â location / {} çè¯ï¼ä¼âæ大åç¼âå¹é å°æ®é location / {} ï¼ç»ææ¯Â deny all ã
#4 æ£å location ä¸ç¼è¾é¡ºåº
location çæ令ä¸ç¼è¾é¡ºåºæ å ³ï¼è¿å¥è¯ä¸å ¨å¯¹ã对äºæ®é location æ令ï¼å¹é è§åæ¯ï¼æ大åç¼å¹é ï¼ä¸é¡ºåºæ å ³ï¼ï¼å¦ææ°å¥½æ¯ä¸¥æ ¼ç²¾ç¡®å¹é ç»ææè å æåç¼â ^~ âæâ = âï¼ç¬¦å·â = âåªè½ä¸¥æ ¼å¹é ï¼ä¸è½åç¼å¹é ï¼ï¼ååæ¢æç´¢æ£å location ï¼ä½å¯¹äºæ£å location çå¹é è§åæ¯ï¼æç¼è¾é¡ºåºé个å¹é ï¼ä¸é¡ºåºæå ³ï¼ï¼åªè¦å¹é ä¸ï¼å°±ç«å³åæ¢åé¢çæç´¢ã
Â
é 置 3.1
server {
        listen       9090;
        server_name  localhost;
Â
        location ~ \.html$ {
            allow all;Â
        } Â
Â
        location ~ ^/prefix/.*\.html$ {
            deny all; Â
        } Â
Â
}
é 置 3.2
server {
        listen       9090;
        server_name  localhost;
Â
      Â
        location ~ ^/prefix/.*\.html$ {
            deny all; Â
        } Â
                 Â
                   location ~ \.html$ {
            allow all;Â
        }Â
Â
}
Â
æµè¯ç»æï¼
URIÂ è¯·æ± | é 置 3.1 | é 置 3.2 |
curl http://localhost:9090/regextest.html | 404 Not Found | 404 Not Found |
curl http://localhost:9090/prefix/regextest.html | 404 Not Found | 403 Forbidden |
Â
解éï¼
Location ~ ^/prefix/.*\.html$ {deny all;} 表示æ£å location 对äºä»¥Â /prefix/ å¼å¤´ï¼Â .html ç»å°¾çææ URI 请æ±ï¼é½æç»è®¿é®ï¼Â   location ~\.html${allow all;} 表示æ£å location 对äºä»¥Â .html ç»å°¾ç URI 请æ±ï¼é½å 许访é®ã å®é ä¸ï¼Â prefix çæ¯Â ~\.html$ çåéã
å¨âé 置 3.1 âä¸ï¼ä¸¤ä¸ªè¯·æ±é½å¹é ä¸Â location ~\.html$ {allow all;} ï¼å¹¶ä¸åæ¢åé¢çæç´¢ï¼äºæ¯é½å 许访é®ï¼Â 404 Not Found ï¼å¨âé 置 3.2 âä¸ï¼Â /regextest.html æ æ³å¹é  prefix ï¼äºæ¯ç»§ç»æ索 ~\.html$ ï¼å 许访é®ï¼äºæ¯Â 404 Not Found ï¼ç¶è /prefix/regextest.html å¹é å°Â prefix ï¼äºæ¯Â deny all ï¼Â 403 Forbidden ã
Â
é 置 3.3
server {
        listen       9090;
        server_name  localhost;
Â
        location  /prefix/ {
                deny all; Â
        } Â
          Â
        location  /prefix/mid/ {
                allow all;Â
        } Â
Â
}
é 置 3.4
server {
        listen       9090;
        server_name  localhost;
Â
     Â
        location  /prefix/mid/ {
                allow all;Â
        } Â
                   location  /prefix/ {
                deny all; Â
        } Â
}
æµè¯ç»æï¼
URIÂ è¯·æ± | é 置 3.1 | é 置 3.2 |
curl http://localhost:9090/prefix/t.html | 403 Forbidden | 403 Forbidden |
curl http://localhost:9090/prefix/mid/t.html | 404 Not Found | 404 Not Found |
Â
æµè¯ç»æ表æï¼æ®é location çå¹é è§åæ¯âæ大åç¼âå¹é ï¼èä¸ä¸ç¼è¾é¡ºåºæ å ³ã
Â
#5 â@â åç¼Â Named Location 使ç¨
REFER:Â Â http://wiki.nginx.org/HttpCoreModule#error_page
å设é ç½®å¦ä¸ï¼
server {
        listen       9090;
        server_name  localhost;
Â
         location  / {
            root   html;
            index  index.html index.htm;
            allow all;
        }
        #error_page 404 http://www.baidu.com # ç´æ¥è¿æ ·æ¯ä¸å 许ç
        error_page 404 = @fallback;
Â
        location @fallback {
            proxy_pass http://www.baidu.com;
        }
}
Â
ä¸è¿°é ç½®æ件çæææ¯ï¼å¦æ请æ±ç URI åå¨ï¼åæ¬Â nginx è¿å对åºç页é¢ï¼å¦æä¸åå¨ï¼åæ请æ±ä»£çå°baidu.com ä¸å»å个弥补ï¼æ³¨ï¼Â nginx å½åç°Â URI 对åºç页é¢ä¸åå¨ï¼Â HTTP_StatusCode ä¼æ¯Â 404 ï¼æ¤æ¶error_page 404 æ令è½æè·å®ï¼ã
Â
æµè¯ä¸ï¼
[[email protected] ~]# curl http://localhost:9090/nofound.html -i
HTTP/1.1 302 Found
Server: nginx/1.1.0
Date: Sat, 06 Aug 2011 08:17:21 GMT
Content-Type: text/html; charset=iso-8859-1
Location: http://localhost:9090/search/error.html
Connection: keep-alive
Cache-Control: max-age=86400
Expires: Sun, 07 Aug 2011 08:17:21 GMT
Content-Length: 222
Â
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://www.baidu.com/search/error.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >here</a>.</p>
</body></html>
[[email protected] ~]#
Â
å½æ们 GET /nofound.html åéç»æ¬Â nginx ï¼Â nginx æ¾ä¸å°å¯¹åºç页é¢ï¼äºæ¯Â error_page 404 = @fallback ï¼è¯·æ±è¢«ä»£çå°Â http://www.baidu.com ï¼äºæ¯Â nginx ç»Â http://www.baidu.com åéäºÂ GET /nofound.html ï¼ä½/nofound.html 页é¢å¨ç¾åº¦ä¹ä¸åå¨ï¼ç¾åº¦Â 302 跳转å°é误页ã
ç´æ¥è®¿é®Â http://www.baidu.com/nofound.html ç»æï¼
[[email protected] ~]# curl http://www.baidu.com/nofound.html -i
HTTP/1.1 302 Found
Date: Sat, 06 Aug 2011 08:20:05 GMT
Server: Apache
Location: http://www.baidu.com/search/error.html
Cache-Control: max-age=86400
Expires: Sun, 07 Aug 2011 08:20:05 GMT
Content-Length: 222
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
Â
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://www.baidu.com/search/error.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >here</a>.</p>
</body></html>
[[email protected] ~]#
Â
æµè¯äºï¼è®¿é®ä¸ä¸ªÂ nginx ä¸åå¨ï¼ä½Â baidu åå¨ç页é¢
[[email protected] ~]# curl http://www.baidu.com/duty/ -i
HTTP/1.1 200 OK
Date: Sat, 06 Aug 2011 08:21:56 GMT
Server: Apache
P3P: CP=" OTI DSP COR IVA OUR IND COM "
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=5C5D2B2FD083737A0C88CA7075A6601A:FG=1; expires=Sun, 05-Aug-12 08:21:56 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Set-Cookie: BAIDUID=5C5D2B2FD083737A2337F78F909CCB90:FG=1; expires=Sun, 05-Aug-12 08:21:56 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Wed, 05 Jan 2011 06:44:53 GMT
ETag: "d66-49913b8efe340"
Accept-Ranges: bytes
Content-Length: 3430
Cache-Control: max-age=86400
Expires: Sun, 07 Aug 2011 08:21:56 GMT
Vary: Accept-Encoding,User-Agent
Connection: Keep-Alive
Content-Type: text/html
Â
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
ãããã
</body>
</html>
æ¾ç¤ºï¼çç¡®ç¾åº¦è¿ä¸ªé¡µé¢æ¯åå¨çã
[[email protected] ~]# curl http://localhost:9090/duty/ -i
HTTP/1.1 200 OK
Server: nginx/1.1.0
Date: Sat, 06 Aug 2011 08:23:23 GMT
Content-Type: text/html
Connection: keep-alive
P3P: CP=" OTI DSP COR IVA OUR IND COM "
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=8FEF0A3A2C31D277DCB4CC5F80B7F457:FG=1; expires=Sun, 05-Aug-12 08:23:23 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Set-Cookie: BAIDUID=8FEF0A3A2C31D277B1F87691AFFD7440:FG=1; expires=Sun, 05-Aug-12 08:23:23 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Wed, 05 Jan 2011 06:44:53 GMT
ETag: "d66-49913b8efe340"
Accept-Ranges: bytes
Content-Length: 3430
Cache-Control: max-age=86400
Expires: Sun, 07 Aug 2011 08:23:23 GMT
Vary: Accept-Encoding,User-Agent
Â
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
ããã
</body>
</html>
å½Â curl http://localhost:9090/duty/ -i æ¶ï¼Â nginx 没æ¾å°å¯¹åºç页é¢ï¼äºæ¯Â error_page = @fallback ï¼æ请æ±ä»£çå°Â baidu.com ã注æè¿éç error_page = @fallback ä¸æ¯é éå®åå®ç°çï¼èæ¯æ说çâ internally redirected ï¼forward ï¼âã