標籤:檔案 io re c html 代碼
try_files $uri $uri/ /index.php$is_args$args;
將這行代碼放在server{}塊裡面即可。
解釋一下含義:
首先是nginx的try_files指令,當一個請求發生時,比如"/abc",它會檢查"/abc"($uri)檔案是否存在以及"/abc/"($uri/)目錄是否存在,如果不存在,則重新導向到最後一個參數"/index.php$is_args$args".
我們知道index.php是架構的"入口檔案"。
而$args是nginx內建變數,代表url中的query字串,也就是get參數啦,像"a=1&b=2&c=3"。
$is_args取決於$args,用三元一次運算式表示:$is_args = empty($args)?‘‘:‘?‘;
這樣一來,假設幾個url,看看是如何重新導向的:
/index/index => /index.php
/admin/index?id=1 => /index.php?id=1
很奇怪是嗎,重新導向以後,路徑都消失了,那麼架構內部又如何路由呢?
答案是$_SERVER[‘REQUEST_URI‘](這裡並不是唯一途徑,架構還會考慮PATH_INFO以及IIS下有特殊處理,但是我們nginx和apache只要有request_uri就可以了),只需要知道一點:雖然nginx內部重新導向了,但是REQUEST_URI參數是沒有改變的,它代表的是原始的url,也就是瀏覽器地址欄中的url。
上面兩個重新導向發生後,實際上:
$_SERVER[‘REQUEST_URI‘]="/index/index";
$_SERVER[‘REQUEST_URI‘]="/admin/index?id=1";
之後架構會根據$_SERVER[‘REQUEST_URI‘]來路由解析。
最後附上我自己的一個配置:
server{ listen 80; server_name 你自己的網域名稱; index index.html index.htm index.php; root /home/wwwroot/yaf; try_files $uri $uri/ /index.php$is_args$args; location ~ .*\.(php|php5)?$ { fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; include fcgi.conf; } location /status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } access_log /home/wwwlogs/access.log access;}