Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
單且快速的 return
這是一個非常簡單的設置方式,只需要個return語句就可以了
return 301 https://example.com$request_uri;
你需要把這段代碼放到nginx配置文件的server代碼塊中,301是永久重定向,你也可以設置成302做一個臨時重定向(不建議)。
一個完整的例子:
return 301 https://example.com$request_uri;
正則表達式 rewrite
如果return不能滿足你的復雜業務需求,你可以考慮下正則匹配重定向:
rewrite ^/foo/(bar)/(.*)$ https://$server_name// permanent;
同樣這也是需要在server代碼塊中,其中permanent為301永久跳轉,若需要302可修改為redirect
一個完整的例子:
server {
listen 80;
listen [::]:80;
hostname example.com www.example.com;
root /var/www/example.com/public;
rewrite ^/foo/(bar)/(.*)$ $scheme://$server_name// permanent;
}
又如:
server {
listen 80;
server_name www.fangyongle.com fangyongle.cn;
if ($host !='www.fangyongle.com' ) {
rewrite ^/(.*)$ https://www.fangyongle.com/ permanent;
}
}
再如:
# 根據文件類型設置過期時間
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
使用Maps
如果你有一堆需要重定向的連接映射,你可以考慮在一個地方定義它,然后再通過if來手動判斷重定向。
首先定義重定向鏈接映射redirect-map.conf
map $request_uri $redirect_uri {
/about.html /about-us;
/customers.html /our-customers;
/products.html /our-products;
}
然后在server代碼塊使用:
include redirect-map.conf;
server {
[…]
if ( $redirect_uri ) {
return 301 $redirect_uri;
}
}
映射也可以有一些語法:
map $request_uri $redirect_uri {
/about.html /about-us;
/customers.html /our-customers;
/products.html /our-products;
# Match any url that ends in products.html or producs.htm
~products\.html?$ /our-products;
# case-insensitive version of the above
~*products\.html?$ /our-products;
# A named capture that maps
# e.g. product-1234.html into /products/item-1234/overview
~product-(?<sku>\d+)\.html /products/item-$sku/overview;
}
一些實用的重定向例子
http 重定向為 https
return 301 https://$host$request_uri;
統一規范域名
server_name example.com www.example.com example.net www.example.net _;
if ( $host !=$server_name ) {
return 301 $scheme://$server_name$request_uri;
}
含 www 和 不含 www 之間的重定向
# non-www to www
if ( $host !~ ^www\. ) {
return 301 $scheme://www.$host$request_uri;
}
# www to non-www
if ( $host ~ ^www\.(?<domain>.+)$ ) {
return 301 $scheme://$domain$request_uri;
}
附錄
重定向中常用全局變量
$scheme // HTTP方法(如http,https),如:http
$host // 請求主機頭字段,否則為服務器名稱,如:blog.fangyongle.com
$server_name // 服務器名稱,如:blog.fangyongle.com
$request_uri // 包含請求參數的原始URI,不包含主機名,如:/2018/81.html?a=1&b=2
$request_filename // 當前請求的文件的路徑名,由root或alias和URI request組合而成,如:/2013/81.htmlnginx 部分常用全局變量
nginx 部分常用全局變量
$remote_addr//獲取客戶端ip
$binary_remote_addr//客戶端ip(二進制)
$remote_port//客戶端port,如:50472
$remote_user//已經經過Auth Basic Module驗證的用戶名
$host//請求主機頭字段,否則為服務器名稱,如:blog.fangyongle.com
$request//用戶請求信息,如:GET ?a=1&b=2 HTTP/1.1
$request_filename//當前請求的文件的路徑名,由root或alias和URI request組合而成,如:/2013/81.html
$status//請求的響應狀態碼,如:200
$body_bytes_sent // 響應時送出的body字節數數量。即使連接中斷,這個數據也是精確的,如:40
$content_length // 等于請求行的“Content_Length”的值
$content_type // 等于請求行的“Content_Type”的值
$http_referer // 引用地址
$http_user_agent // 客戶端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
$args //與$query_string相同 等于當中URL的參數(GET),如a=1&b=2
$document_uri //與$uri相同 這個變量指當前的請求URI,不包括任何參數(見$args) 如:/2018/81.html
$document_root //針對當前請求的根路徑設置值
$hostname //如:centos53.localdomain
$http_cookie //客戶端cookie信息
$cookie_COOKIE //cookie COOKIE變量的值
$is_args//如果有$args參數,這個變量等于”?”,否則等于”",空值,如?
$limit_rate//這個變量可以限制連接速率,0表示不限速
$query_string // 與$args相同 等于當中URL的參數(GET),如a=1&b=2
$request_body // 記錄POST過來的數據信息
$request_body_file//客戶端請求主體信息的臨時文件名
$request_method //客戶端請求的動作,通常為GET或POST,如:GET
$request_uri //包含請求參數的原始URI,不包含主機名,如:/2018/81.html?a=1&b=2
$scheme //HTTP方法(如http,https),如:http
$uri//這個變量指當前的請求URI,不包括任何參數(見$args) 如:/2018/81.html
$request_completion//如果請求結束,設置為OK. 當請求未結束或如果該請求不是請求鏈串的最后一個時,為空(Empty),如:OK
$server_protocol//請求使用的協議,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1
$server_addr//服務器IP地址,在完成一次系統調用后可以確定這個值
$server_name//服務器名稱,如:blog.fangyongle.com
$server_port//請求到達服務器的端口號,如:80
Rewrite正則相關指令詳解
nginx的rewrite相當于apache的rewriterule(大多數情況下可以把原有apache的rewrite規則加上引號就可以直接使用),它可以用在server,location和IF條件判斷塊中,命令格式如下:
rewrite <regex> <replacement> <flag>
正則表達式匹配
文件及目錄匹配判斷
flag標記
使用last和break實現URI重寫,瀏覽器地址欄不變。而且兩者有細微差別:
、定義
<meta> 標簽提供關于 HTML 文檔的元數據。它不會顯示在頁面上,但是對于機器是可讀的。可用于瀏覽器(如何顯示內容或重新加載頁面),搜索引擎(關鍵詞),或其他 web 服務。
2、作用
meta里的數據是供機器解讀的,告訴機器該如何解析這個頁面,還有一個用途是可以添加服務器發送到瀏覽器的http頭部內容,例如我們為頁面中添加如下meta標簽:
瀏覽器的頭部就會包括這些:
只有瀏覽器可以接受這些附加的頭部字段,并能以適當的方式使用它們時,這些字段才有意義。
3、meta的必需屬性和可選屬性
meta的必需屬性是content,當然并不是說meta標簽里一定要有content,而是當有http-equiv或name屬性的時候,一定要有content屬性對其進行說明。例如:
必需屬性
<meta name="keywords" content="HTML,ASP,PHP,SQL">
這里面content里的屬性就是對keywords進行的說明,所以呢也可以理解成一個鍵值對吧,就是{keywords:"HTML,ASP,PHP,SQL"}。
可選屬性
在W3school中,對于meta的可選屬性說到了三個,分別是http-equiv、name和scheme。考慮到scheme不是很常用,所以就只說下前兩個屬性吧。
http-equiv
http-equiv屬性是添加http頭部內容,對一些自定義的,或者需要額外添加的http頭部內容,需要發送到瀏覽器中,我們就可以是使用這個屬性。在上面的meta作用中也有簡單的說明,那么現在再舉個例子。例如我們不想使用js來重定向,用http頭部內容控制,那么就可以這樣控制:
<meta http-equiv="Refresh" content="5;url=http://blog.yangchen123h.cn" />
在頁面中加入這個后,5秒鐘后就會跳轉到指定頁面啦,效果可看W3school的例子
name
第二個可選屬性是name,這個屬性是供瀏覽器進行解析,對于一些瀏覽器兼容性問題,name屬性是最常用的,當然有個前提就是瀏覽器能夠解析你寫進去的name屬性才可以,不然就是沒有意義的。還是舉個例子吧:
<meta name="renderer" content="webkit">
這個meta標簽的意思就是告訴瀏覽器,用webkit內核進行解析,當然前提是瀏覽器有webkit內核才可以,不然就是沒有意義的啦。當然看到這個你可能會有疑問,這個renderer是從哪里冒出來的,我要怎么知道呢?這個就是在對應的瀏覽器的開發文檔里就會有表明的,例如這個renderer是在360瀏覽器里說明的。360瀏覽器內核控制Meta標簽說明文檔
常用meta標簽大總結
接下來就是常用的meta標簽大總結啦,我會盡可能的做到全
charset
charset是聲明文檔使用的字符編碼,解決亂碼問題主要用的就是它,值得一提的是,這個charset一定要寫第一行,不然就可能會產生亂碼了。
charset有兩種寫法
兩個都是等效的。
百度禁止轉碼
百度會自動對網頁進行轉碼,這個標簽是禁止百度的自動轉碼
<meta http-equiv="Cache-Control" content="no-siteapp" />
SEO 優化部分
viewport
viewport主要是影響移動端頁面布局的,例如:
content 參數:
各瀏覽器平臺
Microsoft Internet Explorer
Google Chrome
360瀏覽器
UC手機瀏覽器
UCBrowser_U3_API
QQ手機瀏覽器
Apple iOS
Google Android
App Links
最后——移動端常用的meta
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設置請求和響應的字符集
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
System.out.println("AServlet ----> BServlet");
// 請求轉發
req.getRequestDispatcher("response.html").forward(req, resp);
}
從一個Servlet跳轉到另一個Servlet/JSP/HTML;
瀏覽器地址欄不會發生改變,只發一次請求;
請求轉發是服務器內部行為;
請求轉發使用的是同一個請求和響應對象(設置共享資源,涉及到域對象);
<jsp-config>
<jsp-property-group>
<url-pattern>*.html</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設置請求和響應的字符集
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
System.out.println("RedirectAServlet ----> RedirectBServlet");
// 重定向到BServlet
resp.sendRedirect("bb");
}
一個資源跳轉到另一個資源,會發送新的請求;
一個Servlet跳轉到另一個Servlet/JSP/HTML;
瀏覽器地址欄會發生改變,發送多個請求;
重定向是客戶端(瀏覽器)的行為;
重定向使用的不是同一個請求對象和響應對象;
每次發送請求都會創建新的請求和響應對象;
*請認真填寫需求信息,我們會在24小時內與您取得聯系。