Magento SEO 设置

By admin, 2010年06月28日 1:23 下午

1. 基本的技术优化
1.1. 普通设置
Magento 是搜索引擎最友好的商用平台之一,但有几点需要关注以优化你的 Magento SEO. 第一步是使用最新的版本激活 Server URL rewrites. 你可以找到这个选项在系统按钮下: System => Configuration => Web => Search Engines Optimization. 激活后,在这个页面上,另一个不错的选择是设置“Url Options ”下的 “Add store Code to Urls” ,在大多数情况下,把这个开关设为“No”更好。

1.1.1. WWW vs non-WWW
在 “Unsecure” 和 “Secure” 的下拉菜单里你可以找到 Base URL, 在那里你可以设置你更喜欢的域名。你可以选择WWW的URL或者没有WWW的URL。改变这些设置你不会建立一个重定向从www到non-www或者从non-www到www,而只是你设置的你喜欢的那一个。所以通过 .htaccess with mod_rewrite建立一个301重定向是一个好主意。除此之外,解决了 WWW vs non-WWW 的问题,这个重定向可以预防Magento被加入SID问题到你的URLs,象?SID=b9c95150f7f70d6e77ad070259afa15d. 确保 Base URL 和重定向是一样的。编辑 .htaccess 文件时,你可以加入下面的代码到根目录下的重定向 index.php 中。

大约 119 行:

RewriteBase / RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.mydomain.com/ [R=301,L]
或者,你安装Magento的时候不是在根目录下而是在某个子目录下http://www.mydomain.com/magento/:

RewriteBase /magento/ RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /magento/index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.mydomain.com/magento/ [R=301,L]
1.2. 页眉设置
安装Magento时默认的标题是 “Magento Commerce”。为了你的Magento商店得到它应得得流量,以下你必须了然于胸:

搜索引擎着重于开头的词,所以如果你的关键字靠近页面标题的开头那你有更大的可能性让排名更好。
人们扫视结果页面,一般看开头的几个词。如果你的关键字位于页面的的开始,那你被点击的可能性就大很多。
首先你应该去掉默认的标题 “Magento Commerce”. 后台点击 Configuration => Design => HTML Head. 为你的网站选一个描述性好的标题,这个标题也会在几个没有内容的页面中使用,比如 “Contact Us” 和 “Popular Search Terms”.

把页面标题加到你的店名中,包括目录和商品,把你的店名放在“标题后缀”中。保持前缀空白是个不错的选择,原因上面提到过。同时保持 “Default Description” 和 “Default Keywords” 空白。对于非产品展示页面,为防止整站索引,设置 “Default Robots” 为 “NOINDEX, NOFOLLOW” 会有所帮助,但对于别的页面来说要确保设置为 “INDEX, FOLLOW”.

现在我们优化你的网店页面的 <head> ,好的方法是加上 new canonical tag (新的规范标签)。你可以安装 Canonical URL’s for Magento Module 以便把它们加到你的head种来改进你的Magento SEO。

因某些原因Magento把未设置的meta机器人转为一个meta标签,方式如下:

<meta name=”robots” content=”*” />
这种方式会造成搜索引擎一些奇怪的行为,所以我们要把它移除。要从代码中移除这些空白的meta你可以安装 Yoast MetaRobots Module.

1.3. CMS 页面
第一眼看上去Magento似乎缺少华丽的CMS功能,但对于大多数使用者来说这已经足够了。简单的CMS的好处之一是你能够控制页面的每一个方面。一旦你赋予每一个CMS页面一些不错的内容,选一个SEF URL鉴别者和页面标题,(同时记住1.2小节中的要点),到Meta数据标签处为每个你想要给它排名的CMS页面写上描述。

你可以保持”Keywords”栏空白。描述有一个很重要的作用:引诱人们去点击,所以确保它描述的确实是他们所要点击页面的内容,那样可以引起他们的注意。因此,唯一的好的描述就是自己手写的,如果你考虑用自动描述软件来写描述,那还不如什么也不做,让搜索引擎负责这部分。

如果你不使用meta描述,搜索引擎会在你的文件里找到关键字,并自动选择一条,那样在结果页面里会有一到两个醒目的词。

1.4. 商品目录优化
Magento 给你增加目录名的权利,让你的目录指向产品的URL。因为Magento对建立相同的内容这个功能的支持不够,很好的方式就是禁用它。设置它,点击System => Configuration => Catalog => Search Engine Optimization and set “Use categories path for product URL’s to “no”.

现在是时候设置每一个目录的细节了。点击Catalog => Manage Categories. 最重要的区域是:

Meta 描述: 在这里放上吸引人的描述;记住人们会在搜索引擎的结果列表页中看到这个描述。
页面标题: 保持页面标题空白,使用目录名包括父目录。但你按照要求制作目录时,标题会象你所输入的一样,没有父目录。
URL 要点: 尝试保持短的但是关键字丰富的URL。移除没用的词象“the”,“and”,”for”等等。要注意的是你只能在“all store views”下设置, 对于多语种的商店你应该保持语言的独立。
对于每一个商店界面,你可以指定名字,描述,页面标题和Meta数据。对多语种商店来说这真的是一个很棒的功能。

1.5. 商品优化
商品页面的优化和目录优化有些相似。你可以设置Meta信息为 “Default Values” 并使用于每一个 “Store View”. 注意对于 “Meta Title”, 这个将写在完全的页面标题上,包括目录但不包括标题的前缀/后缀,而不仅仅是商品的名称。

Magento SEO中一个经常忽略的方面是你怎么处理你的图片。通过给图片写标签和考虑给你的图片起怎样的名字,你会从不同的图片搜索引擎得到不错的额外流量。

2.Magento模板优化
2.1. 优化了的空白模板
默认的Magento皮肤如 “Default Theme”, “Blue Skin” 和 “Modern Theme” 在标题方面的工作做得不好,从SEO的角度来看,有很多的地方可以改进。为使它对你变得简单,我们开发了一款空白的Magento SEO模板,基于Magento的核心技术,空白模板合并了所有的东西,你可以下载并一起讨论它 download and discuss it here.

2.2. 标题
默认的 logo 是一个 <h1>, 应该只是出现在首页,在别的页面上它应该是一个<h3>. 最重要的事实让标题的内容置于 <h1> 标签之中,例如,在目录页它应是目录名在商品也应是商品名。

下一步是清除过量的标题。一个好主意是清除侧栏的标题,或者做一个和商店相关的文字(包括关键字)。没有什么理由加上”static” 和没有什么关键字的标题在<h4>中. 是的,例如,把所有的 <h4> 标签换成 <div> to <strong> 标签更好。现在是时候优化你的内容了,在目录页中把商品名放在 <h3> 里,把目录名放在 <h1>里。在商品页,你应该把商品名放在<h1>里.

想了解更多关于为什么正确的标题是重要的,可以阅读这篇文章 Semantic HTML and SEO.

2.3. 清除你的代码
保持你的模板清爽,把你的模板文件中的所有 javascript 和 CSS 移到外部的 javascripts 和css 文件中,因为它们对你的Magento SEO没有任何好处。这样做可以确保你的用户在首次读取文件的时候储存那些文件,搜索引擎不需要花费大量的时间来下载它们。

2.4. 速度辅助
一个很重要的情况是搜索引擎每一天要在你的商店爬过多少页面,你的商店的读取速度有多快。

你可以做两件事来增加你的Magento的速度:

激活缓存。后台点击 System => Cache Management and enable all caching features, like this.
一个号的主机和服务器的设置也是很重要的。用 MySQL 和 PHP opcode 缓存你可以戏剧性的提高你的Mageto速度。
另一件需要考虑的二十外部文件的数量。每一个你让人们下载的文件,他们的浏览器会建立另一个连接到网络服务器。所以非常好的主意就是减少外部文件的数量,合并几个文件为一个文件。默认的Magento已经合并了几乎所有的 javascript 文件到一个文件中。

但 stylesheets 文件没有合并:默认模板有6个不同的stylesheet 文件。你可以把这些文件合并成一个新文件,除了print.css文件,或者你可以使用这个 Fooman Speedster module. 除了合并文件外,这个模数能压缩和缓存你的 javascript 和 stylesheet 文件。 (请注意Speedster的使用条件: mod_rewrite 必须可用,你的服务器需要支持.htaccess。  如果你在Magento同时使用规范的URLs和 Fooman Speedster,你需要利用this download在Canonical module 上写。

3. 高级的Magento SEO 和相同的内容
一旦你完成了所有基础的东西你会发现剩下的事情就是一件简单的事:相同的内容。实际上是大量的相同的内容。商品里有相同的内容,至少,在下面的URLs有完全相同的内容:

domain.com/product.html
domain.com/category1/product.html
domain.com/catalog/product/view/id/1/
domain.com/catalog/product/view/id/1/category/1/
此外,商品回顾页面有几乎一样的内容。另一个问题是目录,你有大量相同的内容在层级导航中和索引选择中。最坏的情况是一个商品在这个页面显示之外,至少还会在这个页面以外的4个页面中显示。

我们将要去掉这些相同的内容,并允许它们被蜘蛛爬但不被索引,固定目录的索引选择和层级导航。

3.1. 无内容页面的Noindex, follow
安装 Yoast robots meta module 并确保设置成防止索引所有的无内容页面,如下:

现在搜索引擎将通过所有的链接来到这些页面上但不会再索引中显示这些页面。

3.2. Nofollowing 非必需的链接
另一简单的步骤来提高你的 Magento SEO 是停止链接到你的登录,付款,希望购买列表和所有其他没有内容的页面。对于RSS feeds,层级导航,增加商品到希望购买列表,增加商品到比较列表来说也是同样的设置。目前还没有插件来完成这些工作。你不得不进入你的模板文件中手工完成。

3.3. 规范的URLs
帮助搜索引擎理解你页面中的相同内容,你可以在每个页面使用你更喜欢的URL,使用新的 canonical URL tag (规范的URL标签),你就应该安装这个 Canonical URL’s for Magento 模数。

3.4. XML 地图
XML 地图是让搜索引擎知道你的内容在哪里的简单方法,它不会帮助你提高排名,但它可以帮助你更快得到索引。你可以手工建立一个XML地图,后台点击 Catalog => Google Sitemap => Add Sitemap, 选择一个文件名,路径和商店界面,然后点击 “Save & Generate”。

然后你可以简单的把下面的代码放到你的 robots.txt 文件中指引搜索引擎向你的 sitemap.xml 文件:

Sitemap: /sitemap.xml
完成了这些修改,你重新获得XML地图。要确认它们是最新的,最好的办法就是建立一个cron工作,更广泛的描述的过程看这里 here.

结尾:Magento SEO的发展
这篇文章涵盖了Magento SEO的所有方面,如果你有任何的反馈,或者有附加意见, let us know, 我们就可以改进这篇文章。我们和Magento核心开发组一起工作来提高Magento SEO的各个方面,我们正试图通过这篇文章得到一些想法和建议可以用到Magento的核心中去。

如何将自定义选项(custom options)导入Magento

By admin, 2010年06月27日 6:57 上午

转载请附上转载地址:http://www.magentochina.org/bbs/viewthread.php?tid=233
在过去的四个月里,我建了四个网店都是用的Magento。我遇到了很多问题,都需要略微的修正。

最近我需要导入200个新的产品。这些产品都有3到4个自定义选项。而标准的Magento导入不允许你导入商品的自定义选项,所以我自己定制了导入的设定并使其允许导入自定义选项。

要在你的Magento网店中加入这个定制,首先要做的是:
复制 app/code/core/Mage/Catalog/Model/Convert/Adapter/Product.php  这个文件到app/code/local/Mage/Catalog/Model/Convert/Adapter/Product.php.
这会防止自动更新撤回你的改动。

第二步,你需要加入一些代码到 local 那个版本的Product.php下(code/local/Mage/Catalog/Model/Convert/Adapter/Product.php).

下面的行号是 Magento 1.3版的。 新的版本可能会有点不一样,行数会靠后些,请注意查找。
在大约566行的时候你会看到:
foreach ($importData as $field => $value) {

在这行上面加入:
$custom_options = array();

在大约575行的时候你会看到(这个代码有2次,请查看后面一次的代码):
$attribute = $this->getAttribute($field);
if (!$attribute) {
continue;
}

You will need to add some code above the continue statement.

在  continue 这个语句的上面,需要加入下面这些代码:


if(strpos($field,’:')!==FALSE && strlen($value)) {
$values=explode(‘|’,$value);
if(count($values)>0) {
@list($title,$type,$is_required,$sort_order) = explode(‘:’,$field);
$title = ucfirst(str_replace(‘_’,’ ‘,$title));
$custom_options[] = array(
‘is_delete’=>0,
‘title’=>$title,
‘previous_group’=>”,
‘previous_type’=>”,
‘type’=>$type,
‘is_require’=>$is_required,
‘sort_order’=>$sort_order,
‘values’=>array()
);
foreach($values as $v) {
$parts = explode(‘:’,$v);
$title = $parts[0];
if(count($parts)>1) {
$price_type = $parts[1];
} else {
$price_type = ‘fixed’;
}
if(count($parts)>2) {
$price = $parts[2];
} else {
$price =0;
}
if(count($parts)>3) {
$sku = $parts[3];
} else {
$sku=”;
}
if(count($parts)>4) {
$sort_order = $parts[4];
} else {
$sort_order = 0;
}
switch($type) {
case ‘file’:

break;

case ‘field’:
case ‘area’:
$custom_options[count($custom_options) - 1]['max_characters'] = $sort_order;

case ‘date’:
case ‘date_time’:
case ‘time’:
$custom_options[count($custom_options) - 1]['price_type'] = $price_type;
$custom_options[count($custom_options) - 1]['price'] = $price;
$custom_options[count($custom_options) - 1]['sku'] = $sku;
break;

case ‘drop_down’:
case ‘radio’:
case ‘checkbox’:
case ‘multiple’:
default:
$custom_options[count($custom_options) - 1]['values'][]=array(
‘is_delete’=>0,
‘title’=>$title,
‘option_type_id’=>-1,
‘price_type’=>$price_type,
‘price’=>$price,
‘sku’=>$sku,
‘sort_order’=>$sort_order,
);
break;
}
}
}
}


现在移到大概710行的位子,你会看到  $product->save();
就在这后面,加入下面的代码:


foreach ($product->getOptions() as $o) {
   $o->getValueInstance()->deletue($o->getId());
   $o->deletePrices($o->getId());
   $o->deleteTitles($o->getId());
   $o->delete();
}

if(count($custom_options)) {
   foreach($custom_options as $option) {
      try {
        $opt = Mage::getModel(‘catalog/product_option’);
        $opt->setProduct($product);
        $opt->addOption($option);
        $opt->saveOptions();
      }
      catch (Exception $e) {}
   }
}

就是这样了,现在一切就绪准备导入自定义产品选项了。

要导入一个自定义选项,你需要在你的CSV导入文件中添加新的一列。新列的名字决定了该选项的名称和类型。格式应该是: Name:Type:Is Required.   (名称:类型:是否必需)。
例如,要创建一个必需的下拉式选项,名称为“Size”,那么列标题应该为:
Size:drop_down:1  (1表示必需,0表示可选)
这是类型的一列。他们会在Magento 管理员界面中的”cumstom options”出现。(原句是:Here is a list of the Types, these are taken from the “Custom Options” screen in the Magento admin area. 这里可能翻译有点问题。)

  • field: Field
  • area: Area
  • file: File
  • drop_down: Drop-down
  • radio: Radio Buttons
  • checkbox: Checkbox
  • multiple: Multiple Select
  • date: Date
  • date_time: Date & Time
  • time: Time

而类型一般都有多种值(drop_down下拉式, radio 单选, checkbox 复选框, multiple 复合式),你可以用一个   |   的分隔符来指定多种值。 例如:小,中,大   你可以用 “小|中|大” 作为你csv文件里 “Size:drop_down:1″ 一列的值。

这里有一个导入格式(原句是:Here’s paired down example of the import format。  对于paried down 可以理解为用逗号分开的相对应的列标题和值)

  sku,       name,       description,     price,   Size:drop_down:1
    T-Shirt1,  T-Shirt,       A T-Shirt,      5.00,    Small|Medium|Large
    T-Shirt2,  T-Shirt2,   Another T-Shirt,   6.00,     XS|S|M|L|XL

另外你可以为每一个自定义选项值指定一个额外的 价格和 SKU 。这个的语句是这样的:
Value:[fixed|percent]:price_modifier
例如,假设你有一个产品,如果是中号的话,价格会上涨5元,如果是大号的话,上涨10元,你就可以用下面的值作为一个自定义选项的值:
Small|Medium:fixed:5|Large:fixed:10

在第一个例子加上额外的 价格/ SKU 后变成:
sku,     name,   description,     price,   Size:drop_down:1
    T-Shirt1,T-Shirt, A T-Shirt,      5.00,    Small:fixed:0:-SM|Medium:percent:2:-MED|Large:percent:3:-LRG
    T-Shirt2,T-Shirt2,Another T-Shirt,6.00, XS:fixed:0:-XS|S:fixed:0:-S|M:fixed:1:-M|L:fixed:1:-L|XL:fixed:2:-XL

---------------
这有一个CSV 文件的样本,我常常用来测试附加代码。
我希望这个修正能对那些需要导入产品自定义选项的人有所帮助。

(我用了excel表格的html代码,可惜在文章中显示不出来。我直接把代码贴到这里了,上面也有CSV文件样本的地址,大家自己点进去看吧。)

  1. http://public.sheet.zoho.com/publish/brianmoney/import-sample]http://public.sheet.zoho.com/publish/brianmoney/import-sample

---------------

原文请见:How to import products with custom options in Magento

不怕版权的ISP之俄罗斯服务器提供商

By admin, 2010年06月11日 4:58 下午

第一个,英文的官网:http://www.hostkey.org/  提供的俄罗斯服务器价格也比较便宜,莫斯科Synterra机房,据说还可以防护一定程度的DDoS攻击。

第二个,俄文官网:http://www.2×4.ru/  稍微贵些,据说啥都不限制

还有一个乌克兰的Kharkiv机房服务器,地址:http://goodnet.com.ua/en/dedicate_server_price.shtml  价格也还不错。

再一个爱沙尼亚的机房的服务器,地址:http://torqhost.com ,也不怕版权,价格也实惠。

Linux VPS下简单解决CC攻击

By admin, 2010年06月11日 4:45 下午

一,准备工作
1,登录进VPS控制面板,准备好随时重启VPS。
2,关闭Web Server先,过高的负载会导致后面的操作很难进行,甚至直接无法登录SSH。
3,以防万一,把设置的Web Server系统启动后自动运行去掉。
(如果已经无法登录进系统,并且重启后负载过高导致刚刚开机就已经无法登录,可联系管理员在母机上封掉VPS的IP或80端口,在母机上用虚拟控制台登录进系统,然后进行2&3的操作,之后解封)

二,找出攻击者IP
1,在网站根目录建立文件ip.php,写入下面的内容。

<?php
    $real_ip = getenv(‘HTTP_X_FORWARDED_FOR’);
    if(isset($real_ip)){
    shell_exec(“echo $real_ip >> real_ip.txt”);
    shell_exec(“echo $_SERVER['REMOTE_ADDR'] >> proxy.txt”);
    }else{
    shell_exec(“echo $_SERVER['REMOTE_ADDR'] >> ips.txt”);
    }

    echo ‘服务器受到攻击,正在收集攻击源,请在5分钟后访问本站,5分钟内多次访问本站有可能会被当作攻击源封掉IP。谢谢合作!’;
   
?>

 

2,设置伪静态,将网站下的所有访问都rewrite到ip.php。
Nginx规则:

    rewrite (.*) /ip.php;

Lighttpd规则:

    url.rewrite = (
    “^/(.+)/?$” => “/ip.php”
    )

3,启动Web Server开始收集IP
进行完1和2的设置后,启动Web Server,开始记录IP信息。
收集时间建议为3到5分钟,然后再次关闭Web Server。
real_ip.txt,这个文件中保存的IP有80%以上都相同的,这个IP就是攻击者实施攻击的平台的IP。
proxy.txt,这个文件中保存的是攻击者调用的代理服务器的IP,需要封掉。
ips.txt,这里记录的是未表现出代理服务器特征的IP,根据访问次数判断是否为攻击源。

三,对上一段的补充
如果VPS上启用了WEB日志,可以查看日志文件的增长速度来判断是哪个站点被攻击。
如果没有启用日志,并且站点数量很少,临时启用日志也很方便 。
如果没有启用日志,并且站点数量过多,可以使用临时的Web Server配置文件,不绑定虚拟主机,设置一个默认的站点。然后在ip.php里加入下面一行

    shell_exec(“echo $_SERVER['HTTP_HOST'] >> domain.txt”);

四,开始封堵IP
建立文件ban.php

<?php
$threshold = 10;
$ips = array_count_values(file('ips.txt'));
$ban_num = 0;
foreach($ips as $ip=>$num){
if($num > $threshold){
$ip = trim($ip);
$cmd = "iptables -I INPUT -p tcp --dport 80 -s $ip -j DROP";
shell_exec($cmd);
echo "$ip baned!\n";
$ban_num ++;
}
}

$proxy_arr = array_unique(file('ips.txt'));
foreach($proxy_arr as $proxy){
$proxy = trim($proxy);
$cmd = "iptables -I INPUT -p tcp --dport 80 -s $ip -j DROP";
shell_exec($cmd);
echo "$ip baned!\n";
$ban_num ++;
}

echo "total: $ban_num ips\n";
?>

 

用下面的命令执行脚本(确保php命令在PATH中)

    php ban.php

这个脚本依赖于第二段中ips.txt里保存的结果,当其中记录的IP访问次数超过10次,就被当作攻击源给屏蔽掉。如果是代理服务器,则不判断次数直接封掉。
封完IP之后,把所有的网站设置恢复正常,站点可以继续正常运行了。

五,一些细节
为保持对操作过程的描述尽量简洁,没有在上面的内容中加入过多的解释,留在这段统一讲述。
1,关于“代理服务器”的一些本质
两个与TCP&HTTP协议相关的值,REMOTE_ADDR和HTTP_X_FORWARDED_FOR。
(1)REMOTE_ADDR总是取离Web服务器最接近的一台主机的IP,如果没有使用代理,这个值就是访问者本身的IP,如果使用了代理,这个值就是代理服务器的IP,如果通过多个代理服务器进行的连接,这个值就是到达Web服务器前最后一台代理服务器的IP。
REMOTE_ADDR是由TCP/IP层决定的,不能修改不能伪造。
(2)HTTP_X_FORWARDED_FOR,因为这个值是属于HTTP部分,而不是TCP/IP,所以这个值不管是什么,都不影响数据的传输。事实上,一般情况下,如果是访问者直接访问Web服务器,这个值为空;通过透明代理的时候,这个值会被代理服务器设置为访问者的IP;通过匿名代理连接时,这个值可能为代理服务器的IP也可能是空的也有可能是随机的。
HTTP_X_FORWARDED_FOR可以被任意修改。大多数代理服务器都是透明代理,也就是说,会把这个值设置为最原始访问者的IP。

2,关于解决CC攻击的层面问题
按处理效率从高到低排列。
(由于本文是针对VPS服务器所写,而VPS简单来说就是服务器的低端替代品,内存和CPU等资源普遍偏低,当然是处理效率越高越好。)
(1)网络传输层。也就是本文所用的iptables,这个工具本身是工作于系统内核,在建立网络连接时直接把攻击者的连接给否了。在这一层面上将攻击源处理掉后,消耗掉的资源几乎可以忽略不计。
(2)Web Server层,大多数Web Server都可以设置禁止访问的IP。在这一层上解决的意义和上面的差不多,但是效率要差些。
(3)脚本层,从脚本程序上制定适合于本身的策略过滤掉攻击源。网络上有很多流传的在这一层面的解决方案,但是不太适用于VPS,而且设置难度可能要增加几倍或者几十倍。

3,为什么不是从日志收集IP?
主要是考虑两点,一是大多数VPS使用者都因为硬盘空间过小,经常清除日志很麻烦,而直接禁止了日志。
二是如果从日志收集IP,脚本复杂程度要高很多,而且可能要根据情况做些调整,考虑到将要读到本文的人大多数都未必掌握更多的技术,本文的目的就是按部就班的依本文进行操作,即可解决问题。

六,其他
本文版权归www.diahosting.com所有,转载请保留超链接。

 http://www.31sky.net/node/389

VPS上自动备份网站数据并发送到远程FTP服务器

By admin, 2010年06月11日 4:42 下午

大家都知道,在godaddy注册域名的时候都会送一个10G的空间,但是用它来建站的时候,就会在所有的页面上显示一个顶部的广告,所以用来建站是不太合适的,但是我们可以利用他来做备份网站数据用,今天在VPS上写了个shell脚本,利用crontab来对网站的数据进行自动备份。下面就是我所用到的shell脚本(注:shell脚本名称为backup.sh,放在/root目录下,mysql的安装目录为/usr/local/mysql,网站的根目录为/home/wwwroot/31sky.net,请根据你自己的实际情况修改shell脚本):

#!/bin/bash
/usr/local/mysql/bin/mysqldump -u mysql用户名 -p mysql密码 mysql数据库名 > /home/wwwroot/31sky.net/$(date +%Y%m%d)-31sky.sql
cd /home/wwwroot/31sky.net
tar -zcvf $(date +%Y%m%d)-31sky.net.tar.gz ./*

echo "open ftp的ip地址
      user ftp用户名 ftp密码
      bin
      prompt off
      mput $(date +%Y%m%d)-31sky.net.tar.gz
      printf "\n"
      close
      bye"|ftp -i -n
rm -rf $(date +%Y%m%d)-31sky.sql $(date +%Y%m%d)-31sky.net.tar.gz

然后修改backup.sh的权限,使其有可执行的权限

chmod +x backup.sh

最后设置crontab:

crontab -e

在里面添加一行(每天的00:10分开始备份):

10 00 * * * /root/backup.sh

注意:有些情况下设置crontab后,但是并不运行,这时你可以重新启动一下crontab:

service crond restart

特价VPS,关于22$/年的VPS

By admin, 2010年06月11日 4:27 下午

关于22$/年的VPS,请大家来验证

购买地址:https://www.hostlatch.net/members/cart.php?gid=4

65% off the first billing cycle: celebrate65
25% off recurring: celebrate25

一年65刀,用65%优惠码,就是22.7

zencart增加评论长度

By admin, 2010年06月11日 7:15 上午

zencart默认评论字数实在太短了,避免某些搞评价的语句减少。修改如下:

ftp:includes\modules\pages\product_reviews\header_php.php里面找到:

$reviews_query_raw = “SELECT r.reviews_id, left(rd.reviews_text, 100) as reviews_text, r.reviews_rating, r.date_added, r.customers_name
FROM ” . TABLE_REVIEWS . ” r, ” . TABLE_REVIEWS_DESCRIPTION . ” rd
WHERE r.products_id = :productsID
AND r.reviews_id = rd.reviews_id
AND rd.languages_id = :languagesID ” . $review_status . ”
ORDER BY r.reviews_id desc”;

把100调整成你要修改的字数(注意:按一英文字母1字算)

GSPAY支付模块-转换其他货币到美元的问题

By admin, 2010年06月10日 9:04 上午

如果你的网站是zencart或oscommerce,网站显示的货币又不仅仅是美元,因为gspay暂时只支持美元支付,所以需要在支付前将其他货币转换成美元进行支付,具体方法见下。

zencart
在includes\classes\currencies.php加方法

function calculate_usd_price($products_price) {
    
     return zen_round($products_price*$this->currencies['USD']['value'], $this->currencies['USD']['decimal_places']) ;
     }

在 includes\modules\payment\gspay.php
找 zen_draw_hidden_field(“Amount[$key]” 。。。
如zen_draw_hidden_field(“Amount[$key]“, number_format($order->info[shipping_cost], 2)) ;
将值转换为 zen_draw_hidden_field(“Amount[$key]“, $currencies->calculate_usd_price($order->info[shipping_cost])) ;

别忘了加:global $_POST, $order, $currencies;

oscommerce与zencart类似,区别在修改currencies.php
function calculate_usd_price($products_price) {    
     return tep_round($products_price*$this->currencies['USD']['value'], $this->currencies['USD']['decimal_places']) ;
     }

Panorama Theme by Themocracy