網頁設計-加快WordPress的頁面生成和載入速度

網頁設計-加快WordPress的頁面生成和載入速度
前一陣,此blog的頁面打開速度慢的要命,我每次打開都需要大約10秒鐘的時間。而通過Google Analytics的資料看到,70%+用戶在這個blog的停留時間還不到十秒:(。所以我決定加速一下我的blog,後來看起來似乎有些效果。下面是我用的一些方法,希望對後來人有些用處。
安裝WP-Cache 2.0
WP-Cache 2.0可以將頁面緩存,在短時間內(默認為1個小時,可以在後臺設置)的再次流覽,將直接發送緩存的頁面,相當於將WordPress給靜態化了。
好處是顯然的。而且這個版本的WP-Cache 2.0在緩存的時候根據頁面URL+Cookie進行緩存的,所以它不會影響COOKIE的使用。注意,WP-Cache 2.0唯讀取Cookie中的email位址,然後根據email位址判定是否屬於同一個用戶。由於大多數人都沒有留下Email,所以我修改成根據Cookie中的用戶名來判斷,將插件目錄下的wp-cache-phase1.php的第67行改成:
//if (preg_match(“/^wordpress|^comment_author_email_/”, $key)) {
if (preg_match(“/^wordpress|^comment_author_/”, $key)) {
由於大部流覽者的cookie都是空的,所以這個插件會加快這大部分的流覽速度。另外,這個插件還會偵測文章更新,即時更新緩存等。
但是缺點也是顯然的。首先,在頁面還沒有生成的時候,就進行COOKIE的讀取和交換,將降低速度,某種程度上來說,它使得頭次流覽的速度更慢。再者,這個插件在運行的時候,還是得先把其他插件初始化,所以它只是減少了頁面生成的函數調用的時間。
效果:不明顯。事實上,這個插件主要是用來降低系統CPU占用量的,對頁面載入速度影響有限。
改善插件
我並沒有安裝太多插件,而且都是些小型的插件,從來不裝像UTW那樣的巨無霸插件。但是我還是把那些非插件必須的檔(大部分是我修改插件的時候新加的)都移出插件目錄。以免WP錯把它們當成插件檔進行初始化處理。
效果不明。因為經過處理的檔不多也不大,想必影響有限。
頁面靜態化
一個不變的事實是:html頁面永遠要比php頁面快的多,而且幾乎不佔用CPU資源。所以將頁面靜態化是一個好主意。但將所有頁面靜態化,沒有這個必要。所以我選擇了將blog主頁進行靜態化處理——各位如果不信的話,直接頁面刷新,然後看一下右邊的隨機文章變了沒有:)。
我同學告訴我頁面靜態化有很多種方法,但我決定採用最土的一種方法:
首先,在根目錄下建立一個cron.sh檔,裏面的內容是:
wget -O /home/aaaa/zhiqiang.org/blog/index.html http://zhiqiang.org/blog/index.php
上面的/home/aaaa是我的根目錄,其中aaaa是用戶名。再使用Fterm SSH登錄遠端主機,輸入
crontab -e
在出來的編輯介面中輸入
*/10 * * * * /home/aaaa/cron.sh
再保存就OK了。這樣,系統會自動地每10分鐘一次將blog的動態主頁index.php轉成靜態的index.html,以後訪問主頁的時候就會直接訪問index.html,從而實現了blog主頁面的html靜態化。
缺點:COOKIE失效。不過山人自有妙計,使用javascript本地讀取COOKIE然後填入表格即可。
效果:明顯。
合併JS和CSS檔
流覽頁面的時候,把頁面保存下來,便能看到這個頁面含有的檔。檔太多,會大大降低流覽速度。而WordPress的插件系統使得JS和CSS檔很多,所以,應當合併一下JS和CSS檔。
手動合併是一個方法,但是容易弄錯,而且不太好修改。另一個方法是建立一個新的all.js.php檔,內容是:
< ?php
require_once(‘目錄/wp-blog-header.php’ ) ;
include (“/blog/a.js” ) ;
include (“/b.js” ) ;
?>
就是將header.php裏面的那些js文件都include到all.js.php,然後在header裏面包含all.js.php檔即可:

網頁設計大膽狂塗網頁設計分享

網站架設-更改檔案瀏覽的檔案圖象

 主題: 更改檔案瀏覽的檔案圖象
 
 工具: Apache,Notepad
 
 實例: 已更改的檔案圖象瀏覽
 

 內容:

舊的檔案圖象可能已經沉悶,如果想改一個有特色的瀏覽檔案介面可以試用這個方法解決。 
  

 編碼:

基本設定:

 .htaccess
  Options +Indexes
IndexOptions FancyIndexing
解 令資料夾能夠瀏覽和使用 FancyIndexing。

圖像設定:

 .htaccess
  AddIcon /icon/php.gif .php
解 令副檔案名稱是 .php 使用 /icon/php.gif 的圖像。

對應表:

 ^^DIRECTORY^^ 資料夾
  ^^BLANKICON^^ 空白圖象

 

 步驟:

首先上載 icon 這個資料夾在網頁上。
修改 .htaccess 中的 icon 資料夾位置。
上載所需的 .htaccess 檔案在顯示或隱藏的資料夾。 
 
  下載:

已更改的檔案圖象瀏覽實例
  
 

 注意:

資料夾下的子目錄也會受影響。
若想改變子目錄的設定請上載有關的 .htaccess 檔案。
上載了 .htaccess 檔案可能不能在 FTP 上載工具中看見。
預設 .htaccess 檔案是不能在瀏覽器中下載。

網頁設計大膽狂塗網頁設計教學分享

網頁設計教學-備份mysql

網頁設計教學-備份mysql

用 Telnet/SSH 登入伺服器中。
輸入伺服器的用戶名稱和密碼。
假設您的:

備份儲存檔案為 backup.sql
資料庫名稱為 sqldb
MySQL 用戶名稱是 mysql_user
MySQL 密碼是 mysql_password

$mysqldump –opt -u mysql_user -pmysql_password sqldb > backup.sql

這樣便完成。

網頁設計分享-如何使用中山大學的計數器

隨著中山大學之 W3 Server 遷移至新機器,舊的 Counter 服務也即將終止,而新的 Counter 服務將採用由 Muhammad A Muquit 所發展且於 WWW 上被廣為使用之 WWWCount 2.3 版!但基於此服務是完全免費的,為方便及有效的管理,特修改程式以做以下之更動:

  1. 限制自定紀錄檔(使用df參數),但中山大學使用者例外. 紀錄檔是以 HTTP_REFERER 之環境變數自動產生,所謂的 HTTP_REFERER 變數是指當某個首頁中使用到這裡的 counter 服務時,Browser 在讀取這個計數器時會傳來該首頁之 URL, 此 URL 便會存在於此變數中.因此相同之首頁以不同之 URL 來讀取計數器時,兩者是不同的.舉例:

    kpp.nsysu.edu.tw 與 www.nsysu.edu.tw 實際上為同一台機器, 但當 Browser 以 http://kpp.nsysu.edu.tw/index.html 和 以 http://www.nsysu.edu.tw/index.html 來取得 counter 時, 此 counter 會視為不同.

    基於以上原因,建議您在公佈您的首頁時,請盡量使用統一一個 URL, 而如果該 hostname 有 www 之 alias 的 話,最好使用以 www 為啟始之 hostname.

  2. 舊有之 pubcounter 關閉使用.
    舊有之 pubcounter?USER_XXX=Y.gif 之方式已取消。
  3. 基本語法如下:
    <img src=”http://counter.nsysu.edu.tw/Count.cgi?keyword=value> 或
    <img src=”http://counter.nsysu.edu.tw/bin/count?keyword=value>
    兩者兼可.如有超過一個以上之參數,可以 ‘&’ 或 ‘|’ 隔開.
    若只想使用內定值,則使用 <img src=”http://counter.nsysu.edu.tw/Count.cgi”> 即可.
  4. 如有需要重定計數,可以 st=啟始數 重定之.如:
    <img src=”http://counter.nsysu.edu.tw/Count.cgi?st=100>
    表示重置以 100 算起,記得在重置成功以後,將該參數移除.
  5. 目前特別收集了 172 (0-171) 種字型供使用,設定方式為:
    <img src=”http://counter.nsysu.edu.tw/Count.cgi?dd=12>
    其中 12 即是表示使用編號為 12 之字型.
  6. 其他可使用參數請自行參考原說明檔,在此不便說明.
  7. 新使用者可直接使用而不必另外申請.
  8. 如果記錄檔半年內沒有使用過, 即馬上清除
  9. 效果如同右上角的計數器

網頁設計技術-表單有奇怪的空白

網頁設計技術-表單有奇怪的空白
為什麼表單元素的前後有一大塊空白?
  解決思路:
  因為表單元素form是默認外補白margin屬性不為0的塊元素,所以要解決問題有兩個方法,定義塊元素為行內元素,或者設置CSS物件的margin屬性為0。
  具體步驟:
  方法一:設置CSS物件的margin屬性為0:
<div style=”border:1px solid #000″>第一行</div>
<form style=”margin:0px” enctype=”application/x-www-form-urlencoded”></form>第二行

  方法二:把塊元素設置為行內元素:
<div style=”border:1px solid #000″>第一行</div>
<form style=”display:inline” enctype=”application/x-www-form-urlencoded”></form>第一行

  雖然還有一種是把

<form enctype=”application/x-www-form-urlencoded”>標籤跟
或者
<td> </td>
  嵌套的寫法,但不推薦使用: </form><form enctype=”application/x-www-form-urlencoded”>
<table border=”0″><form enctype=”application/x-www-form-urlencoded”></form></table>

<table border=”0″>
<tbody>
<tr><form enctype=”application/x-www-form-urlencoded”>
<td>單格</td>
</form></tr>
</tbody></table>
  注意:第一種方法在表單前後的文字不在同一行,而第二種方法同行。
  提示:如果想改變所有表單的這個效果,可以直接在CSS裏定義:
<!–
form{margin:0px}
–>

<!–
form{display:inline}
–>
 

網頁設計大膽狂塗網頁設計教學分享

網站架設教學-apache用htaccess顯示

網站架設教學-apache-用htaccess顯示錯誤訊息英文的喔….
# supress php errors
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0
Preserve (log) your site’s PHP errors via htaccess

# enable PHP error logging
php_flag  log_errors on
php_value error_log  /home/path/public_html/domain/PHP_errors.log
Protect your site’s PHP error log via htaccess

# prevent access to PHP error log
<Files PHP_errors.log>
 Order allow,deny
 Deny from all
 Satisfy All
</Files>
Now, in this article, we will explore these operations 2 in greater depth, provide additional functionality, and examine various implications. First we will explore PHP error handling for production environments (i.e., for websites and applications that are online, active, and public), then we will consider error handling for development environments (i.e., for projects that are under development, testing, private, etc.).
Controlling the level of PHP error reporting
Using htaccess, it is possible to set the level of error reporting to suit your particular needs. The general format for controlling the level of PHP errors is as follows:

# general directive for setting php error level
php_value error_reporting integer
There are several common values used for “integer”, including:

Complete error reporting — for complete PHP error logging, use an error-reporting integer value of “8191”, which will enable logging of everything except run-time notices. 1
Zend error reporting — to record both fatal and non-fatal compile-time warnings generated by the Zend scripting engine, use an error-reporting integer value of “128”.
Basic error reporting — to record run-time notices, compile-time parse errors, as well as run-time errors and warnings, use “8” for the error-reporting integer value.
Minimal error reporting — to record only fatal run-time errors, use an error-reporting integer value of “1”, which will enable logging of unrecoverable errors.
Of course, there are many more error-reporting values to use, depending on your particular error-logging needs. For more information on logging PHP errors, refer to the Error Handling and Logging Functions page at php.net.

Setting the maximum file size for your error strings
Using htaccess, you may specify a maximum size for your PHP errors. This controls the size of each logged error, not the overall file size. Here is the general syntax:

# general directive for setting max error size
log_errors_max_len integer
Here, “integer” represents the maximum size of each recorded error string as measured in bytes. The default value is “1024” (i.e., 1 kilobyte). To unleash your logging powers to their fullest extent, you may use a zero value, “0”, to indicate “no maximum” and thus remove all limits. Note that this value is also applied to displayed errors when they are enabled (e.g., during development).

Disable logging of repeated errors
If you remember the last time you examined a healthy (or sick, depending on your point of view) PHP error log, you may recall countless entries of nearly identical errors, where the only difference for each line is the timestamp of the event. If you would like to disable this redundancy, throw down the following code in the htaccess file of your project root:

# disable repeated error logging
php_flag ignore_repeated_errors on
php_flag ignore_repeated_source on
With these lines in place, repeated errors will not be logged, even if they are from different sources or locations. If you only want to disable repeat errors from the same source or file, simply comment out or delete the last line. Conversely, to ensure that your log file includes all repeat errors, change both of the on values to off.

Putting it all together — Production Environment
Having discussed a few of the useful ways to customize our PHP error-logging experience, let’s wrap it all up with a solid, htaccess-based error-handling strategy for generalized production environments. Here is the code for your target htaccess file:

# PHP error handling for production servers
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_log /home/path/public_html/domain/PHP_errors.log
php_value error_reporting 999999999
log_errors_max_len 0

<Files /home/path/public_html/domain/PHP_errors.log>
 Order allow,deny
 Deny from all
 Satisfy All
</Files>
Or, if you prefer, an explanatory version of the same code, using comments to explain each line:

# PHP error handling for production servers

# disable display of startup errors
php_flag display_startup_errors off

# disable display of all other errors
php_flag display_errors off

# disable html markup of errors
php_flag html_errors off

# enable logging of errors
php_flag log_errors on

# disable ignoring of repeat errors
php_flag ignore_repeated_errors off

# disable ignoring of unique source errors
php_flag ignore_repeated_source off

# enable logging of php memory leaks
php_flag report_memleaks on

# preserve most recent error via php_errormsg
php_flag track_errors on

# disable formatting of error reference links
php_value docref_root 0

# disable formatting of error reference links
php_value docref_ext 0

# specify path to php error log
php_value error_log /home/path/public_html/domain/PHP_errors.log

# specify recording of all php errors
php_value error_reporting 999999999

# disable max error string length
php_value log_errors_max_len 0

# protect error log by preventing public access
<Files /home/path/public_html/domain/PHP_errors.log>
 Order allow,deny
 Deny from all
 Satisfy All
</Files>
This PHP error-handling strategy is ideal for a generalized production environment. In a nutshell, this code secures your server by disabling public display of error messages, yet also enables complete error transparency for the administrator via private error log. Of course, you may wish to customize this code to suit your specific needs. As always, please share your thoughts, ideas, tips and tricks with our fellow readers. Now, let’s take a look at a generalized error-handling strategy for development environments..

Putting it all together — Development Environment
During project development, when public access to your project is unavailable, you may find it beneficial to catch PHP errors in real time, where moment-by-moment circumstances continue to evolve. Here is a generalized, htaccess-based PHP error-handling strategy for development environments. Place this code in your target htaccess file:

# PHP error handling for development servers
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_log /home/path/public_html/domain/PHP_errors.log
php_value error_reporting 999999999
php_value log_errors_max_len 0

<Files /home/path/public_html/domain/PHP_errors.log>
 Order allow,deny
 Deny from all
 Satisfy All
</Files>

網頁設計大膽狂塗網頁設計分享

網頁設計技術-防止鎖定

網頁設計技術-防止鎖定

通常 Web 表單在執行 submit 時,會有需要將頁面的控制項鎖定,不要讓使用者重覆按鍵,此範例就是在 submit 時鎖定了整個頁面的控制項,不用針對特定的按鈕去鎖定。

在 Page_Load 事件中加入如下程式碼就可以達到這個需求,若將這個函式寫到 BasePage 就可以適用所有繼承的頁面。

view plaincopy to clipboardprint?
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
dles Me.Load
    Dim sScript As String = String.Empty
  sScript = “function FormDisabled()” & vbNewLine & _
              “{” & vbNewLine & _
              “var oForm = document.forms[‘form1’];” & vbNewLine & _
           “if (!oForm) {” & vbNewLine & _
         ”  oForm = document.form1;}” & vbNewLine & _
               “oForm.disabled=true;” & vbNewLine & _
              “}”
   Me.ClientScript.RegisterClientScriptBlock(Me.GetType, “FormDisabled”, sScript, True)
   Me.ClientScript.RegisterOnSubmitStatement(Me.GetType, “FormDisabled”, “setTimeout(‘FormDisabled()’,0);”)
End Sub 

先來看一個簡單的例子:
下面以三個頁面分別命名為frame.html、top.html、bottom.html為例來具體說明如何做。

frame.html 由上(top.html)下(bottom.html)兩個頁面組成,代碼如下:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<HTML>
<HEAD>
<TITLE> frame </TITLE>
</HEAD>
<frameset rows=”50%,50%”>
<frame name=top  src=”top.html”>
<frame name=bottom  src=”bottom.html”>
</frameset>
</HTML>

現在假設top.html (即上面的頁面) 有七個button來實現對bottom.html (即下面的頁面) 的刷新,可以用以下七種語句,哪個好用自己看著辦了。

語句1. window.parent.frames[1].location.reload();
語句2. window.parent.frames.bottom.location.reload();
語句3. window.parent.frames[“bottom”].location.reload();
語句4. window.parent.frames.item(1).location.reload();
語句5. window.parent.frames.item(‘bottom’).location.reload();
語句6. window.parent.bottom.location.reload();
語句7. window.parent[‘bottom’].location.reload();

top.html 頁面的代碼如下:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<HTML>
 <HEAD>
  <TITLE> top.html </TITLE>
 </HEAD>
<BODY>
<input type=button value=”刷新1″ onclick=”window.parent.frames[1].location.reload()”><br>
<input type=button value=”刷新2″ onclick=”window.parent.frames.bottom.location.reload()”><br>
<input type=button value=”刷新3″ onclick=”window.parent.frames[‘bottom’].location.reload()”><br>
<input type=button value=”刷新4″ onclick=”window.parent.frames.item(1).location.reload()”><br>
<input type=button value=”刷新5″ onclick=”window.parent.frames.item(‘bottom’).location.reload()”><br>
<input type=button value=”刷新6″ onclick=”window.parent.bottom.location.reload()”><br>
<input type=button value=”刷新7″ onclick=”window.parent[‘bottom’].location.reload()”><br>
</BODY>
</HTML>
下面是bottom.html頁面源代碼,為了證明下方頁面的確被刷新了,在裝載完頁面彈出一個對話框。

bottom.html 頁面的代碼如下:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<HTML>
 <HEAD>
  <TITLE> bottom.html </TITLE>
 </HEAD>
<BODY onload=”alert(‘我被加載了!’)”>
<h1>This is the content in bottom.html.</h1>
</BODY>
</HTML>
解釋一下:
1.window指代的是當前頁面,例如對於此例它指的是top.html頁面。
2.parent指的是當前頁面的父頁面,也就是包含它的框架頁面。例如對於此例它指的是framedemo.html。
3.frames是window對象,是一個數組。代表著該框架內所有子頁面。
4.item是方法。返回數組裡面的元素。
5.如果子頁面也是個框架頁面,裡面還是其它的子頁面,那麼上面的有些方法可能不行。

附:
Javascript刷新頁面的幾種方法:
1   history.go(0)
2   location.reload()
3   location=location
4   location.assign(location)
5   document.execCommand(‘Refresh’)
6   window.navigate(location)
7   location.replace(location)
8   document.URL=location.href

自動刷新頁面的方法:
1.頁面自動刷新:把如下代碼加入<head>區域中
<meta http-equiv=”refresh” content=”20″>
其中20指每隔20秒刷新一次頁面.

2.頁面自動跳轉:把如下代碼加入<head>區域中
<meta http-equiv=”refresh” content=”20;url=http://www.wyxg.com”>
其中20指隔20秒後跳轉到http://www.wyxg.com頁面

3.頁面自動刷新js版
<script language=”JavaScript”>
 function myrefresh()
 {
      window.location.reload();
 }
 setTimeout(‘myrefresh()’,1000); //指定1秒刷新一次
</script>

ASP.NET如何輸出刷新父窗口腳本語句
1.  this.response.write(“<script>opener.location.reload();</script>”); 

2.  this.response.write(“<script>opener.window.location.href = opener.window.location.href;</script>”);  

3.  Response.Write(“<script language=javascript>opener.window.navigate(”你要刷新的頁.asp”);</script>”)
JS刷新框架的腳本語句

//如何刷新包含該框架的頁面用
<script language=JavaScript>
  parent.location.reload();
</script>
//子窗口刷新父窗口
<script language=JavaScript>
   self.opener.location.reload();
</script>
( 或 <a href=”javascript:opener.location.reload()”>刷新</a>   )

//如何刷新另一個框架的頁面用
<script language=JavaScript>
  parent.另一FrameID.location.reload();
</script>

如果想關閉窗口時刷新或者想開窗時刷新的話,在<body>中調用以下語句即可。

<body onload=”opener.location.reload()”> 開窗時刷新
<body onUnload=”opener.location.reload()”> 關閉時刷新

<script language=”javascript”>
window.opener.document.location.reload()
</script>

網頁設計技術-PHP 的 include 跟 require 的不同點

網頁設計技術-PHP 的 include 跟 require 的不同點

在談函式前我們先談談一些php的內定函式

在程式的設計上!程式設計師經常會用到插入,文件的動作,像是插入一個函式庫,文件,等等
所以這一節我們先討論一下插入(include 及 require)

1.require (置換)
REQUIRE(‘檔案’) 這一個用法和C 語言的前端處理程式 #include 很像,他的運作方式是把本身以指定的檔案置換,置換檔案時先執行script
( 先執行再傳回結果:錯誤跳離)

2.include (插入)
include () 這一個用法和require的用法很像不過他的運作理念和require有一些差異也就是當程式執行include的時候,會先進行插入才會讀取檔案!
(先插入程序再執行:錯誤警告)
所以當程式用require時 ,遺失了檔案程式就會發生錯誤,但在include插入的模式下,就不會終止程式。
例子如下:
<?php
//開始include

echo”include執行結果</p>”;
//123不存在
$files=array(‘0704124337else.php’,’123.php’,’0704120304if.php’);
//連續載入
for ($c = 0; $c < count($files); $c++) {
 include($files[$c]);
 echo”<br />”;
}
//程式會整個跑完把錯誤show出來但。

?>
<br>
<hr>
<?php
//開始require
echo”require執行結果<p>”;
//連續載入
$files=array(‘0704124337else.php’,’123.php’,’0704120304if.php’);
for ($c = 0; $c < count($files); $c++) {
 require($files[$c]);
 echo”<br />”;
}
//跑到錯誤掛住了
?>

相當的簡單吧!
註:
當然的是您可以使用http的方式把別人的網頁還進
自己的網站!不過要記得的是!傳進來的只是html而
不是程式碼!(如果是程式碼那真的是嚇死人了 . .|||)
您可以試試這樣
 include(“http://www.kimo.com.tw/index.html“);

這樣就可以把kimo的網頁帶到自己的網頁了.
不過好像不太有意義!

網頁設計大膽狂塗網頁設計教學分享

網頁設計分享-MySQL和phpMyAdmin中文亂碼

網頁設計教學分享-MySQL和phpMyAdmin工中文亂碼

最近筆者勤於備份資料,而且試著把建立在MySQL資料庫中的資料在各種平台轉來轉去,發現了許多的問題,而這些問題在網路上有許多網友問過,但看到很多人找不出答案,因而放棄重裝系統或者放棄掉寶貴的舊有資料,那麼我相信筆者這一篇文章可能會讓您放棄掉堅持在所謂的”UTF-8中文亂碼”的迷思。
為什麼筆者稱之為”迷思”,許多使用PHP程式語言搭配MySQL資料庫的朋友百分之一百零一會使用phpMyAdmin,但隨著MySQL資料庫版本的升級,phpMyAdmin資料庫管理工具也跟著改版,曾幾何時您會發現,原本使用phpMyAdmin工具可以在資料表中看到的中文,變成了亂碼。

狀況(1) phpMyAdmin未升級前正常,升級後中文變亂碼
測試環境
phpMyAdmin版本:2.5.6
MySQL版本:4.1.8-nt
架站環境:Appserv – Win32
網站的預設編碼:big5
儲存於MySQL的編碼:latin1

 

phpMyAdmin版本:2.6.1 rc-1
MySQL版本:4.1.8-nt
架站環境:Appserv – Win32
網站的預設編碼:big5
儲存於MySQL的編碼:latin1

 

phpMyAdmin工具版本升級後,結果中文變成亂碼。

這種情況並不會影響前台輸出中文,所以訪客瀏覽網頁時一樣正常,差別在於自己在phpMyAdmin時工作並不方便,中文都變成了亂碼的原因在於瀏覽器預設的檢視編碼不同,原本舊版的2.5.6版以預射big5繁體中文去檢視網頁,而這個版本以後的新版phpMyAdmin一律都以UTF-8檢視,因此才會變成亂碼。

 

這並不會影響到原本儲存於資料庫中的資料,所以大可不用擔心,解決的方法就是使用舊版的phpMyAdmin或者自己寫一套資料庫管理工具、另外找尋非UTF-8檢視的資料庫管理軟體。

狀況(2) 中文UTF-8編碼網站,前台瀏覽正常,phpMyAdmin檢視中文變成亂碼
測試環境
phpMyAdmin版本:2.6.1 rc-1
MySQL版本:4.1.8-nt
架站環境:Appserv – Win32
網站的預設編碼:UTF-8
儲存於MySQL的編碼:UTF-8

也許很多朋友和筆者和MySQL中文亂碼奮戰的時候,會看過很多”品種”的中文亂碼,為什麼phpMyAdmin已經是用UTF-8檢視網頁了,看到的結果仍舊是火星文,後來經過反覆的測試,筆者先規納出以下的圖表作說明:

 

一般而言,初次安裝Appserv架站軟體或者在Linux系統中建立MySQL資料庫,預設的資料庫編碼及資料傳送方式都會是latin1,從一個不是UTF-8的網頁表單中鍵入資料,送出到處理的php程式,它取得的字串就不會是UTF-8編碼,而以latin1的編碼儲存到資料表欄位中,最終的編碼也是latin1。所以只要用舊版的phpMyAdmin去瀏覽,看到的一樣會是正常的中文字。

而UTF-8網站的處理過程如下圖:

 

在UTF-8網頁中的表單輸入資料,其資料在UTF-8網頁中可以檢視,因為當輸入的時候該資料本身就是UTF-8編碼的資料,當送出表單時,這些UTF-8的資料會經過資料庫的處理存入欄位中,因為MySQL資料庫預設傳送的編碼是latin1,所以它把UTF-8編碼資料以latin1編碼存入資料表的欄位中,而變成亂碼。但這個亂碼仍然是UTF-8編碼的,只是因為被latin1給弄亂了,所以不管是用什麼樣的編碼語系去讀取這些字串,看到的只是亂碼,不可能讀的出正常的中文字串。

當前台的程式呼叫時(例如phpbb論壇),MySQL資料庫會以latin1將這些亂碼”還原”成”正常”的UTF-8中文字。

在latin1的預設編碼下,不管怎麼在phpMyAdmin更改資料庫、資料表、資料表欄位的連線校對為utf8_general_ci、utf8_unicode_ci或latin1_swedish_ci等編碼,都會是一樣的結果,看到的都會是同一款品種的火星文。

如果您想要在phpMyAdmin中看到UTF-8顯示正常的中文字,以下有兩種解決方案:

更改MySQL預設的連線編碼設定
Linux或Unix-like環境
找出 /etc/my.cnf 檔案,這個檔案是MySQL資料庫的設定檔,詳細的說明請參閱vbird的WWW伺服器#MySQL效能調校,內文有更詳細的參數說明,但在此很簡單地只要改兩個地方就可以讓MySQL預設的latin1編碼連線方式改成UTF-8。

 

Win32 – Appserv架站軟體
在Windows環境下,則MySQL設定檔為my.ini,一般而言存放在c:/window 這個目錄底下,同樣地找尋上述兩個地方將其從latin1改成utf8。

程式語法限定MySQL傳送的編碼
在此以phpBB2論壇為例,在db.php中第60行以後加入以下指令,告知MySQL都以UTF-8的方式傳送資料:

 

筆者將一個UTF-8網站,但MySQL是預設latin1連線的網站,在讀取資料庫的程式碼中,加入如上圖示第62行的程式碼之後,網頁上只要是從資料庫讀出來的中文字都變成了亂碼,但試著新增一筆資料,結果如下:

 

宣告以UTF-8編碼連線後,原本好好的UTF-8中文都變成亂碼了,因為那些資料原本都是以latin1重編過的UTF8資料,要以latin1編碼呼叫才能夠還原出原本的UTF-8中文字,但現在強制以UTF-8編碼連線,就無法還原了,因此,讀者們看到的火星文和資料庫中的一模一樣地出現在網頁上。

 

宣告以UTF-8編碼連線後,所輸入的中文字,終於可以在phpMyAdmin中看到,這可是確確實實的UTF-8中文,而不是被latin1編碼搞亂的中文字。但是看看上圖藍色框框的部份,不同品種的火星文出現了!但是那些中文字都變成了一堆??????????????問號,這是為什麼呢?看看下圖,筆者相信讀者們的觀念就釐清了。

 

因為在筆者的測試中,只有把第二個欄位的連線效對改成UTF-8,其它都一樣還是維持latin1的連線效對,也就是說,如果全部以UTF-8編碼的方式,確實地在phpMyAdmin等以UTF-8檢視的資料庫管理軟體中看到非亂碼的中文字,不但MySQL的連線部份要UTF-8編碼,資料表的欄位也必須用UTF-8的連線較對,否則會失敗。

 狀況(3) 中文UTF-8編碼網站,在其它Hosting使用mysqldump指令備份,mysql指令匯入正常,但在MySQL 4.x部份中文錯亂或匯入失敗
相信一定會有讀者遇到這種情況,由其是在外國租用Hosting空間或VPS的讀者,因為外租的主機是不可能為單一個戶去改變系統的預設值的,尤其在英語系國家,存在任何字碼,英文字還是英文字,並不會因為說存在不同的編碼就變成亂碼,所以一律都是預設的。因此,在沒辦法去要求主機商將MySQL的連線編碼改成big5或UTF-8的情況下,一切都只能靠自己解決了。

用mysqldump指令備份資料庫是最完整的方法,而且不需要將主機服務停止就可以隨時備份,但注意,如果您是採取完美顯示UTF-8中文字的解決方案,在沒辦法使用UTF-8編碼連線的狀況下,在國外預設為latin1的主機下使用mysql指令匯入資料庫會失敗!

即使自己的主機預設是latin1,國外的主機預設也是latin1,照理說用mysqldump指令備份,mysql指令還原,會非常順利,但筆者在測試的過程中發現,某些情況下,部份UTF-8中文字正常,但部份中文字會跳字(變成其它字)和變成亂碼,後來筆者發現,這是因為Mysql資料庫版本不同而發生的,當筆者在MySQL版本4.1.8(預設連線編碼latin1)的情況下使用mysqldump備份,傳到國外主機,MySQL版本為5(預設連線編碼latin1),用mysql指令匯入,非常地順利,一下子網站就可以正常運行了,中文字也正常地顯示在網頁上。

但當筆者要備份國外主機的資料庫回自己的主機時,卻發現匯入時指令中斷,打開備份檔將有問題的SQL字句都刪除後,再匯入,雖然順利匯入到資料庫中了,但中文字卻出現跳字和部份亂碼的情況,筆者研判是,版本相容性的問題,舊版本的備份檔可以匯進新版本的MySQL資料庫,但從最新版本的資料庫備份出的檔案要匯進舊版本可能就會發生問題了。

最後筆者將自己測試用的主機MySQL的版本也從4.1.8升級到5系列版本,在國外主機備份的檔案,一下子就順利匯入了,也不再有中文字跳字及部份亂碼的情況發生。

附錄
MySQL資料庫備份語法
如果您是使用Appserv架站軟體,那麼先從開始列 – 執行 – 輸入: cmd

 

接下來會出現以下視窗,對於不熟DOS介面的讀者跟著輸入指令就可以了。

 

指令是:

mysqldump – -opt database > backup-file.sql

其中- -opt (這是兩個-連在一起,因為本網站程式會將連在一起的減號取代字串) 是快速完整備份的指令,紅色字的database是您要備份的資料庫名稱,綠色字的 backup-file.sql是匯出而產生的備份檔,可自由命名。在Linux也是用這個語法。

MySQL資料庫匯入備份檔語法
指令是:

mysql database < backup-file.sql
 
後記
希望這篇教學文章可以省掉讀者們不少時間,筆者花了許多時間在和這些中文亂碼搏鬥,只求一個安心的備份方式,後來有些心得,仍覺得在網路上還沒有一篇文章比較詳細具體的說明相關的狀況,所以筆者花了約6個小時準備這篇文章,如果可以省下一位讀者10個小時的摸索和試誤,1000個讀者就為這個地球省下10000個小時的時間了, 而筆者需要的是您花30秒迴響給我的鼓勵與支持,謝謝,希望對您有幫助。

《轉貼處》
AdSenseor網路觀察家
網址:http://www.adsenseor.com

網頁設計大膽狂塗網頁設計教學分享

網頁設計教學-htaccess重要性

網頁設計教學-htaccess重要性

htaccess 檔是 apache http 伺服器上的一個設定檔。
一般來說,管理人員都會開放部份功能給你自行設定,也有的會完全關閉對 .htaccess 的支援。

設定網頁密碼;
設定發生錯誤時出現的文件;
改變首頁的檔案 (index.html);
禁止讀取檔案;
重新導向文件;
加上 MIME 類別;
防止列出目綠內的檔案..等等
其實還有很多功能,不過一般只會開放一般功能給你用 (除非你是管理員…),而我也不識那麼多。所以我只說一般會用到的功能。

【.htaccess 簡介 】
.htaccess 是一個文字檔,你可以做任何好像 notepad 的文字編輯器去寫一個。
或者你會對 .htaccess 這個名字有點困惑,其實 .htaccess 是一個完全的檔案名,不是 filaname.htaccess 或者甚麼的(當然也有管理員故意把它設定成其他名字,但一般都是用 .htaccess 的)。為何是 .htaccess?因為所有以 “.” 開頭的檔名在 *nix 系統中也是有屬性隱藏的,平常列出資料夾時不會出現,所以保安會好一點。你可能會問:『MS Windows 要我一定給它一個名字,如何把它存檔成為 .htaccess?』 其實方法有兩個。第一個是到 ms-dos 的視窗中,按 ren filename.xxx .htaccess 就可以了;第二個是在上傳到伺服器時才改名做 .htaccess。
而 .htaccss 內設定的格式是一行一個指令,如果你的 notepad 設定了自動換行的話,請關上它,這樣會比較安全。
一點要注意, .htaccess 是 apache 的產物,不是 IIS 的。IIS 伺服器不支援它,也就是說你不能以簡單地上傳一個 ASCII 檔去設定在 IIS 伺服器上的 http 服務。
在上載 .htaccess 時,必需使用 ASCII 模式!你或許還要 chmod 它到 644(RW_R__R_)。
每一個放了 .htaccess 的目錄和它的子目錄都會被 .htaccess 影響。如果我在 /abc/ 放了一個 .htaccess,那麼 /abc/ 和 /abc/def/ 內所有 file 都會被它影響,但 /index.html 不會被它影響 ←← 這一點是很重要的。

【密碼保護 】

這是最常見 .htaccess 被使用的功能之一,資料夾密碼保護。
這種方法可以使沒有授權的瀏覽者不能進入你所設定的限制區域,使用了 Javacript 設的密碼太簡單了,一下字就會被破解,而使用 .htaccess 系統就比使用 CGI 程式保護會員專頁將更為有效,更安全。更重要的是使用 .htaccess 方式去設定不需要編寫程式的技能。
首先,你要開啟一般文字編輯工具,做出一個名叫 .htpasswd 的檔名(當然又可能是其他,但一般伺服器都會設定 .htpasswd 是不能經由 http 讀到的。檔案中的的每一句代表一個使用者,使用者名稱以及加密了的密碼是以冒號(分隔。而密碼必須經過加密才可以使用。加密的方法是一般密碼使用了的 crypt,如果你不知如何加密,請到以下的網頁。
UHome
http://www.euronet.nl/~arnow/htpasswd/

注: Win32 版本的 apache 好像不支援用了 crypt 加密法的密碼檔,只支援 SHA1 和 MD5 的。如果你是使用 apahce for win32 版本,請使用 C:Program FilesApache GroupApachebinhtpasswd.exe 做出以 MD5 加密的密碼檔!!

再在 .htaccess 中,加上以下句子
AuthName MemberPage
AuthType Basic
AuthUserFile /absolute/path/.htpasswd
require valid-user

AuthName 就是當 browser 得知要密碼時所出現的句字,你可以自行改動 MemberPage;而第二句的 AuthType Basic 就千萬不要去改;第三句的 AuthUserFile 就是設定所使用的 .htpasswd 檔,要留意它好像必需是在伺服器上的絕對路徑。請留意,這不是 URL 的位置、也不一定是在 ftp 中看到的位置、就算是由 CGI 自行測到的路徑也未必準確,請細看伺服器上的說明 (例如在 virtualave.net,URL 是 /.htpasswd ftp 看到的是 /public_html/.htpasswd,CGI 測到 /home/public_html/.htpasswd,但是事實上你要設定路徑為 /data1/virtualave.net/USERNAME/public_html/.htpasswd)。
為了保安理由,不建議把 .htpasswd 放到可以用 http 去到的目錄;
最後的 require 就是命令伺服器誰可以進入,require valid-user 就是指只要是 .htpasswd 中的任何一人就可了;你也可以指定在名單上只有某人可以通過,require user username 或 require user username1 username2 username3;也可以指定是某組人才可以,require group groupname。

而設定組的方法是再做一個叫 .htgroup 的文字檔,內容如下:
groupname1: username1 username2 username3
groupname2: username1 username3 username4

再在 .htaccess 中加多一句 AuthGroupFile /absolute/path/.htgroup 和 .htpasswd 的方法一樣,我不再說了。

以 ASCII 模式上傳所有檔案後,在那個資料夾中所有檔案都會被保護。
而再進一步,我們更可以設定個別設定只有某個檔案會密碼,不同檔案要不同的密碼,但是我會晚一點才說。

【自設錯誤報告文件 】
想做到好像 www.microsoft.com 一樣, 找不到文件不只是幾句白底黑字,也不是 IE 本身那個有 bug 的 “找不到網頁”,而是另一頁 HTML 文件嗎?
逢法很簡單,首先寫一頁說找不到文件的 HTML,再用 notepad 打開您的 .htaccess。在最後加上一句

ErrorDocument 404 404.html
404.html 是錯誤檔案路經,即所顯示的檔案;404 是錯誤碼。以下就是一般會見到的錯誤碼和所代表的錯誤原因。
401
Authorization failed 授權失敗;即是錯誤 password
403
Access denied 存取違規;即是你不可以讀取這個檔案
404
File not found 找不到檔案
500
Internal Server Error 伺服器內部錯誤;可能是 http 伺服器本身是問題,也可能是 CGI 出錯
也有以下兩類做法
ErrorDocument 404 “找不到”
ErrorDocument 500 http://www.xxx.com/xxx
Ps. 如果所用的錯誤文件是一個 CGI 檔,就會有一點關於那個錯誤的資科放到環境變數內給 CGI 讀取。

【自設首頁檔案 】
這個可以算是最簡單的一個設定了

DirectoryIndex index.html index.htm index.cgi
很簡單,常你的網址是一個目錄,沒有注明檔名時 (如: http://www.xxx.com/) 它會顯示 index.html。如果沒有這個檔案,就找下一個檔案。如果沒有任可一個名單上的檔案,就會依設定列出目錄內的檔名。

【禁止讀取檔案 】
如果你的 CGI 會把秘密的內容(如: 密碼)存到一個檔案,那麼別人只要知道這個檔案的位置,就可以很簡單的看到一切。不想這樣嗎?你可以完全不改變其他設定,不用把那個檔案移到其他地方,只需在 .htaccess 加幾句就可以。
order allow,deny
deny from all

而 Apache 1.3 以後的版本,我們更可以用支援 regular expression 的 filesmatch

order allow,deny
deny from all

其實 files 也可用 regular expression 的,但要加一個 ~ 在前(例: )。 files 和 filesmatch 的意思就是,內堻Q包著的幾句只會對付合要求的部份檔案生效。
接著我就說有關中間的文字→order deny, allow,就是先找出禁止(deny) 的,才去找例外許可的 (allow)。如果把它們反轉,就是 order allow, deny 就是,就是先找出許可(allow) 的,才去找禁止的 (deny)。之後的 deny form all 就是說,全部 IP 來的都不可以。相對地 allow form all 也就是全部都可以。而你更可以這樣做
order allow,deny
allow form all
deny form 123.456     所有以 123.456 開始的 IP,如 123.456.1.1

除了設定 IP 外,您也可以設定 hostname(如: xxx.com)

Files 和 Filesmatch 的用途很多,你不但可以設定 deny,更可以設定 個別檔案的密碼,如

require user abc

require user def

【重新導向文件 】
就是重新導向文件。

Redirect /abc http://www.xxx.com/abcabc
Redirect permanent /def http://www.xxx.com/def
即是說,如果 browser 要求 http://_____/abc 它就會重新導向至 http://www.xxx.com/abcabc而第二句又有甚麼不同呢?答案就是 http 的狀能碼不同,parmanet (301) 是永遠的,代表 browser 下一次未必會再要求這檔案,而直接找另一個。除了 permanent 之外,還有 temp ( 301;和不寫一樣)、seeother(303) 和 gone(410)。
也有 RedirectMatch,不過它就支援 regular expression。

【防止列出目綠內的檔案 】
其實要做到這個目標可以不用 .htaccess,你只要自己寫一頁 index.html 放入去就可以了。但是,用 .htaccess 會方便很多,在 .htaccess 中加一句。

Option -Indexes
這樣做,伺服器就不會多事地把目錄內的檔名列出。如果你只不過是想不列出某幾個檔案,請用以下的設定
IndexIgnore *.gif *.jpg
我想就算只識一點英文的人也會明白,就是在列出檔名時不理會(ignore) 後面的檔案。

Ps. 如果設定了 IndexIgnore *,它就不會列出任何檔案,但是會有 HEADER 和 README 的內容,而它們是可以自設的。

——————————————————————————–

透過 .htaccess 來阻擋 Referer Spam
基本上就是從 Apache 中把這些 Referers 直接 Ban 掉。怎麼作呢?如果你的虛擬主機商允許你使用 .htaccess,那麼你可以用下面的方式把 Referer Spam 阻擋在 pLog 之外:

SetEnvIfNoCase Remote_Addr [IP Address] ban
SetEnvIfNoCase User-Agent [Browser Name] ban
SetEnvIfNoCase Referer [Referer Keyword] ban
Order Allow,Deny
Allow from all
Deny from env=ban

網頁設計大膽狂塗網頁設計教學分享