国际电子商务技术 & Magento开发公司

Maishen technologies

Welcome visitor! You canlogin orcreate an account.

热线:+86-0532-58973093

麦神科技有限公司
Mygod Technologies

官方认证开发工程师

nginx 配置指令介绍

2013年1月17日星期四 Asia/Shanghai下午5:51:51

Nginx中的正则表达式

1、if指令

所有的Nginx内置变量都可以通过if指令和正则表达式来进行匹配,并且根据匹配结果进行一些操作,如下:

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}
 
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;
}

使用符号~*和~模式匹配的正则表达式:

  1. ~为区分大小写的匹配。
  2. ~*不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)。
  3. !~和!~*意为“不匹配的”。

Nginx在很多模块中都有内置的变量,常用的内置变量在HTTP核心模块中,这些变量都可以使用正则表达式进行匹配。

2、可以通过正则表达式匹配的指令

location

查看维基:location
可能这个指令是我们平时使用正则匹配用的最多的指令:

location ~ .*\.php?$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /data/wwwsite/test.com/$fastcgi_script_name;
        include        fcgi.conf;
    }

几乎每个基于LEMP的主机都会有如上一段代码。他的匹配规则类似于if指令,不过他多了三个标识符,^~、=、@。并且它没有取反运算符!,这三个标识符的作用分别是:

  1. ^~ 标识符后面跟一个字符串。Nginx将在这个字符串匹配后停止进行正则表达式的匹配(location指令中正则表达式的匹配的结果优先使用),如:location ^~ /images/,你希望对/images/这个目录进行一些特别的操作,如增加expires头,防盗链等,但是你又想把除了这个目录的图片外的所有图片只进行增加expires头的操作,这个操作可能会用到另外一个location,例如:location ~* \.(gif|jpg|jpeg)$,这样,如果有请求/images/1.jpg,nginx如何决定去进行哪个location中的操作呢?结果取决于标识符^~,如果你这样写:location /images/,这样nginx会将1.jpg匹配到location ~* \.(gif|jpg|jpeg)$这个location中,这并不是你需要的结果,而增加了^~这个标识符后,它在匹配了/images/这个字符串后就停止搜索其它带正则的location。
  2. = 表示精确的查找地址,如location = /它只会匹配uri为/的请求,如果请求为/index.html,将查找另外的location,而不会匹配这个,当然可以写两个location,location = /和location /,这样/index.html将匹配到后者,如果你的站点对/的请求量较大,可以使用这个方法来加快请求的响应速度。
  3. @ 表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,只能用于Nginx产生的子请求,主要为error_pagetry_files

注意,这3个标识符后面不能跟正则表达式,虽然配置文件检查会通过,而且没有任何警告,但是他们并不会进行匹配。
综上所述,location指令对于后面值的匹配顺序为:

  1. 标识符“=”的location会最先进行匹配,如果请求uri匹配这个location,将对请求使用这个location的配置。
  2. 进行字符串匹配,如果匹配到的location有^~这个标识符,匹配停止返回这个location的配置。
  3. 按照配置文件中定义的顺序进行正则表达式匹配。最早匹配的location将返回里面的配置。
  4. 如果正则表达式能够匹配到请求的uri,将使用这个正则对应的location,如果没有,则使用第二条匹配的结果。

server_name

查看维基:server_name
server_name用于配置基于域名或IP的虚拟主机,这个指令也是可以使用正则表达式的,但是注意,这个指令中的正则表达式不用带任何的标识符,但是必须以~开头:

server {
  server_name   www.example.com   ~^www\d+\.example\.com$;
}

server_name指令中的正则表达式可以使用引用,高级的应用可以查看这篇文章:在server_name中使用正则表达式

fastcgi_split_path_info

查看维基:fastcgi_split_path_info
这个指令按照CGI标准来设置SCRIPT_FILENAME (SCRIPT_NAME)和PATH_INFO变量,它是一个被分割成两部分(两个引用)的正则表达式。如下:

location ~ ^.+\.php {
  (...)
  fastcgi_split_path_info ^(.+\.php)(.*)$;
  fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_path_info;
  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  (...)
}

第一个引用(.+\.php)加上/path/to/php将作为SCRIPT_FILENAME,第二个引用(.*)为PATH_INFO,例如请求的完整URI为show.php/article/0001,则上例中SCRIPT_FILENAME的值为/path/to/php/show.php,PATH_INFO则为/article/0001。
这个指令通常用于一些通过PATH_INFO美化URI的框架(例如CodeIgniter)。

gzip_disable

查看维基:gzip_disable
通过正则表达式来指定在哪些浏览器中禁用gzip压缩。

gzip_disable     "msie6";

rewrite

查看维基:rewrite
这个指令应该也是用的比较多的,它需要使用完整的包含引用的正则表达式:

rewrite  "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;

通常环境下我们会把它和if结合来使用:

if ($host ~* www\.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1为'/foo',而不是'www.mydomain.com/foo'
}

需要注意的是rewrite后面的第一个正则参数永远是只对URI进行匹配,而不是对完整的带主机头的URL,如上例中,if语句来判断主机头,如果匹配www\.(.*),则设置一个变量$host_without_www的值为www\.(.*)的引用,如果上例中的请求URL为www.mydomain.com/foo,则$host_without_www的值为mydomain.com,而下面的rewrite指令中,第一个正则表达式的引用将为/foo,则最终通过这个重写后的请求URL为http://mydomain.com/foo。

3、Nginx中的正则如何匹配中文

首先确定在编译pcre时加了enable-utf8参数,如果没有,请重新编译pcre,然后就可以在Nginx的配置文件中使用这样的正则:”(*UTF8)^/[\x{4e00}-\x{9fbf}]+)$”注意引号和前面的(*UTF8),(*UTF8)将告诉这个正则切换为UTF8模式。

4、如何测试你的正则表达式

通常我们在Nginx安装之前会编译安装pcre,它自带一个小工具:pcretest,使用方法以下:

[root@backup conf]# pcretest
PCRE version 8.10 2010-06-25

  re> /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3,3}$/  ###这是一个匹配IP的正则
data> 192.168.10.1
 0: 192.168.10.1
 1: 192
 2: .1
 3: 1
data> 666.666.666.666
No match
data> 255.255.255.255
 0: 255.255.255.255
 1: 255
 2: .255
 3: 255
data> 0.0.0.0
 0: 0.0.0.0
 1: 0
 2: .0
 3: 0
data> 666777
No match

匹配中文:

[root@backup conf]# pcretest
PCRE version 8.10 2010-06-25

  re> /^[\x{4e00}-\x{9fbf}]+/8
data> 测试
 0: \x{6d4b}\x{8bd5}
data> Nginx模块参考手册中文版
No match
data> 参考手册中文版
 0: \x{53c2}\x{8003}\x{624b}\x{518c}\x{4e2d}\x{6587}\x{7248}

注意正则表达式后面的8,它表示这条正则使用UTF-8匹配。

0 Comments | Posted By lei sheng

产品详细页面显示总价格代码

2013年1月16日星期三 Asia/Shanghai下午6:04:06

在 模板目录下 /catalog/product/viw/addtocart.phtml文件中添加如下代码,具体参考三笑的效果

<script> jQuery('.qty-btn-block > span').click(function(){ var qty=jQuery("#qty").val();
price=<?php echo $_product->getFinalprice()?>//total=qty*1total=parseInt(qty)*price;total=total.toFixed(2);jQuery("#b_price").html(total);})
</script> <div class="Total"><strong>Total: </strong><span id="allPrices"><span>US$ <b id="b_price"><?php echo $_product->getFinalprice();?></b><span></span> 
</div>        <div id="teroop">        <button type="button" title="<?php echo $buttonTitle ?>" class="button btn-cart" onclick="productAddToCartForm.submit(this)"><span><span><?php echo $buttonTitle ?></span></span></button>       </div>        <div id="teroo" style="display:none;">        <button type="button" class="teroi" onclick="javascript:window.location.href='<?php echo Mage::getBaseUrl('web')?>checkout/cart'"><span><span></span></span></button>        </div>                      <div id="loaddingtext" style="display:none">    <img src="<?php echo $this->getSkinUrl('images/terry/adding.gif'); ?>">Adding...    </div>     <div id="addsusess" style="color:#21A308;display:none">    <img src="<?php echo $this->getSkinUrl('images/terry/loading_comp.png'); ?>">Add to cart successfully    </div>                    <?php echo $this->getChildHtml('', true, true) ?>    </div>

 

php中获取价格可以通过  $_product->getFinalprice();

0 Comments | Posted in Magento开发 By lei sheng

电子商务网站如何使用“群体的智慧”

2013年1月16日星期三 Asia/Shanghai下午5:44:43

前面的例子只是极简单的一类应用。个性化推荐技术能实现很多在我们看来十分神奇的效果。这时你可能会有一个疑惑:这个听起来有点“玄”的技术, 零售网站能实施吗?前面我们已经提到,网站可以根据购买了某一款产品的所有顾客的历史数据来推测购买了这一款产品的用户还会对哪些产品感兴趣,这就是所谓 的“群体的智慧”。比如,顾客甲和顾客乙都对电子商务感兴趣,他们都买过很多这方面的书籍,其中甲买过《网站页面设计》,乙买过《数据挖掘》。从用户的角 度看,我们通过历史数据看到甲和乙都买过不少同样的书,据此可以判断他们的偏好比较相近,这时候我们称甲和乙这两个顾客比较“相似”。所以,我们可以把乙 买的《数据挖掘》推荐给甲,因为乙喜欢的书很可能甲也会感兴趣。从产品的角度看,我们在历史数据中可能发现包括甲和乙在内的很多顾客的购买记录里都有《网 站页面设计》和《数据挖掘》这两本书,这两本书的介绍和关键词或许也有重复之处。因此我们可以推测这两本书比较相关,称它们具有比较高的“关联性”。所 以,如果发现新来的顾客丙买了其中的一本,我们就可以直接向丙推荐另一本。在接下来的内容中,我们将讨论零售网站是如何来实现这一思想的,包括网站可以利 用的数据资源,以及如何使用这些数据资源。

挖掘网站历史数据的价值

很多零售网站都有非常丰富的顾客历史数据,包括登录、点击、浏览以及购买等等。这些数据都是零售网站的天然宝藏。如果你把数据放在地下室让它们 堆满灰尘,这些数据就是一项负资产,它们需要硬件来存储,需要人员来管理,却没有任何使用价值。通过个性化推荐技术,我们能充分挖掘出这些数据的价值。

顾客历史数据中蕴含着巨大的价值!

个性化推荐技术主要关心顾客在零售网站上的三个方面的行为数据:首先是购买数据,比如我们在Amazon和Netflix上经常看到的“购买了 该商品的人还购买了......”,这些推荐就是来自于购买数据;其次是对产品的评分,比如Levis的Style Finder网站可以让顾客给衣服打分,用1~7的数字表示你有多喜欢它;最后一种是浏览数据,比如顾客看过什么产品以及看了几次,看了多长时间等。现在 这种数据还不常用,但是其中蕴含的信息量很大,因此是很有前景的待开发对象。

顾客喜欢什么产品?从数据中找答案

读到这里大家可能已经注意到一个问题:我们一直在强调借助相似的人或相关的产品来推测顾客可能喜欢哪些产品。作为零售网站,如何判断哪些顾客比 较相似,或者哪些产品关联度高呢?既然需要运用“群体的智慧”,为什么甲和乙是相似的,《网站页面设计》和《数据挖掘》是相关的呢?这个问题的答案,就藏 在零售网站的数据中。

在探讨如何从历史数据中挖掘出顾客之间的相似性和产品之间的关联度之前,先想想我们自己是如何判断这个问题的。用人工来判断两个人的相似性或产 品的关联度很大程度上是靠直觉。对于顾客相似性的判断:如果两个人喜欢同样的一些产品,他们就比较相似。比如我们经常去图书大厦里看各种电子商务的书,同 时发现有另外一个人也喜欢在电子商务的书架前晃悠,我们就会认为自己和这个人兴趣相近。对于产品关联度的判断:如果很多顾客的购买记录里都同时出现某两个 产品,这两个产品的关联度就比较高。比如一些买过朗道的《统计物理学:卷Ⅰ》的顾客,他们的购买记录里都有《统计物理学:卷Ⅱ》。对于人来说,这是个非常 容易的判断。个性化推荐系统就是要训练机器来学习人工判断的过程,主要方法也是通过分析哪些顾客喜欢同样一些产品,或哪两个产品会一起出现在大量顾客的购 买记录里。

正如前面提到的,现在的零售网站在挖掘顾客的偏好时主要采取以下两种思路:一种是基于用户(user-based)来判断顾客之间的相似性,即 判断某位顾客与哪群人更相似,于是把这群人买过的产品推荐给他。另一种是基于产品(item-based)来判断产品之间的关联度。对于第一种思路,业内 现在常使用的一种技术就是基于用户的协同过滤。虽然名字听起来很高深,但是背后的道理却非常简单:人以群分,经常买同样商品的人,也有相似的偏好。虽然我 们不知道顾客具体看上了产品的哪一点,但我们能知道都喜欢这个产品的人还可能会喜欢哪些其他的产品。比如我们不能知道甲和乙在买iPod的时候具体喜欢它 的什么特征,但是我们能知道甲和乙在电子产品上的偏好相似,于是我们就能把乙购买过的,但是甲没有买过,甚至不知道的商品推荐给他。

使用基于用户的协同过滤技术的一个著名零售网站是CDNOW。它是一个出售音乐专辑的零售网站,网站有一个个性化的推荐模块:My CDNOW。My CDNOW其实是一个个性化的商店,每个人的My CDNOW里面展示的都是他们喜欢的专辑。这个个性化系统正体现了亚马逊总裁杰夫·贝佐斯的话:“如果我的网站上有一百万个顾客,我就应该有一百万个商 店”。CDNOW主要是通过消费者的评分数据进行推荐,网站知道用户A买了哪些专辑以及给专辑的打分,根据这些数据,CDNOW就能用协同过滤的方法去寻 找与用户A打分相似的“邻居”。然后,把“邻居们”评分很高,但是A还没买的专辑展示在A的My CDNOW页面上。

著名的音乐零售网站CDNOW

同时,也有一些专注于推荐技术的公司在使用协同过滤技术帮助用户解决问题。比如Baynote公司开发了“群体智慧平台”来帮助网站提高消费者 的点击率以及购买转换率。Baynote的解决方案是:把消费者和与他们相似的人联系起来,让一个群体内的成员来做“导购”。例如,当我们看到自己的朋友 购买了一本新书,我们也会更愿意去购买它。现在,公司正在为媒体和电子商务企业提供个性化的推荐服务——网络零售500强公司中有14家选择了 Baynote的服务。

Baynote: 美国的推荐技术服务公司

群体的智慧

对于第二种思路(基于产品的推荐),主要是判断哪些产品之间更加相关。比如消费者对iPhone感兴趣,他对iPhone的各种配件也会有兴 趣。判断iPhone和配件之间关系的依据是它们被共同购买的频率,有时也可利用商品的描述和分类信息。在网站的记录中,如果有很多用户都同时拥有 iPhone和配件,那么这两个商品就比较相关。当然,基于产品的推荐不仅能发现互补的商品(就像手机和配件),而且还能发现一些有潜在联系的商品。

最简单的挖掘产品关联性的方法是购物篮分析,它主要分析顾客过去的每一次交易里,哪些产品会一起出现。以前,有不少大型超市根据购物篮分析来优 化货架的位置,最广为人知的例子是,上世纪九十年代初期,美国中西部的一家零售商通过分析消费者的购物篮发现了著名的“啤酒-尿布综合症”:年轻男顾客的 购物篮中,尿布和啤酒经常会同时出现。一个潜在的联系是:这些年轻的男顾客被老婆打发出来买尿布之后,都会自己拎一罐啤酒回去。那么,对于年轻的男顾客, 每次他们出来买尿布的时候,我们都可以向他推荐啤酒;而年轻的女顾客出来买尿布的时候,再推荐啤酒对就没有意义了。

现在,使用得比较多的方法是基于产品的协同过滤,前面提到的零售网站Amazon也采用了相关的技术。与基于用户的协同过滤相类似,基于产品的 协同过滤是看哪些产品与另外的产品更相近。如果买了产品A的人从来不买产品B,买产品B的人也不会买产品A,这两个商品的距离很远,关联度比较低。基于产 品的协同过滤有一个明显的优点,对于大型零售网站来说,他们的用户数量远远大于产品的数量。计算用户之间的相似性可能要算1000万次,但是产品之间的相 似性只需要计算10万次就可以了。

有趣的是,现在不少零售网站把基于产品的推荐方法与其他技术结合起来使用,取得了很好的效果。最热门的混合应用就是将推荐技术和社会化网络结合 起来。Goodrec[1]最近把社会化网络加入到了个性化推荐系统中,主要是借助于顾客的朋友、家人的评分信息来进行产品的推荐。它让顾客的朋友和家人 做“导购”,把他们买的产品推荐给顾客。比如你的朋友最近买了一本书,他对这本书的评价不错,Goodrec就会把这本书推荐给你。Goodrec还可以 帮助顾客选购礼物,比如你最近经常看iPad,你的朋友会收到推荐:“如果你想送礼物给他,就送个iPad吧”。

Goodrec 的个性化推荐系统

[1] Goodrec是一个在2008年Techcrunch 50会议上推出的移动应用服务公司,后更名为Mob.ly。2009年Goodrec 推出了适用于手机浏览器的推荐引擎,基于用户在手机上对不同产品浏览时的评分。由于用户是在手机上进行评价,Goodrec采取了简单的评价方式:用户对 浏览过的餐厅、酒吧等评价对象,只需评价“好”、“不好”或“不知道”或简单短信。2010年5月,该公司被美国著名团购网站Groupon收购。

0 Comments | Posted in Magento新闻 By lei sheng

Chrome&Safari浏览器兼容问题

2013年1月16日星期三 Asia/Shanghai下午5:41:01

网页常常为了排版美观,会使用忽大或小的文字,通常font-size文字为12px(像素)文字。设置大于12px文字字体,各浏览器都能显示出CSS所设置文字大小效果。但是CSS设置小于12px文字时候谷歌浏览器google Chrome就不能显示出CSS所设置小于12px的文字字体效果。

谷歌浏览器默认最小字体为12px,小于12px的字体它都以12px显示,有时我们需要字体小点,特别是在制作英文网站时,常常使用CSS样式显示小于12px文字,这样谷歌浏览器就不能显示所设置较小的文字。不过还是有解决方案的。

webkit的私有属性:
.seletor{-webkit-text-size-adjust:none;}
禁止webkit浏览器配置调整网页的字体大小。

但是,如果在全局定义了 html{-webkit-text-size-adjust:none;} 会导致另一个现象:浏览器一般提供给小群体用户一个功能,就是放大与缩小网页视图。禁用了这一属性,在chrome下放大网页,会导致其它元素均放大,而文字却依然为原定义的“12px”。

这样造成了不友好的体验,给有需要的用户造成阅读上的门槛。故,有需要设置小于12px字体的元素单个定义即可,但是,这个被定义的小元素,将令浏览器的缩放功能失效。

0 Comments | Posted By lei sheng

magento获取某个分类下产品的销售排行

2013年1月15日星期二 Asia/Shanghai下午5:43:05

调用方法


showtotal是总共显示多少条数据,category_id是显示某个分类下的产品
    
    $totalPerPage = ($this->show_total) ? $this->show_total : 6;
    $counter = 1;
    $catalogid = ($this->category_id) ? $this->category_id : 29;
    $_featcategory = Mage::getModel('catalog/category')->load($catalogid);
    $visibility = array(
        Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
        Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
    );
    $storeId= Mage::app()->getStore()->getId();
    $_productCollection = Mage::getResourceModel('reports/product_collection')
        ->addAttributeToSelect('*')
        ->addOrderedQty()
        ->addAttributeToFilter('visibility', $visibility)
        ->addCategoryFilter($_featcategory)
        ->setOrder('ordered_qty', 'desc');

核心代码就是最后两句了....通过分类ID来过滤分类,通过订单数量来排序
<?php foreach($_productCollectionas$product): ?>
    <?php if($counter<= $totalPerPage): ?>
        <?php $productUrl=  $product->getProductUrl(); ?>
        <a href="<?php echo $productUrl ?>"title="View <?php echo $product->name ?>">
            <h4><?php echo$product->name ?></h4>
        </a>
        <small>已售出: <?php echo(int)$product->ordered_qty ?></small><br />
        <a href="<?php echo $productUrl ?>"title="View <?php echo $product->name ?>">
            <img src="<?php echo $this->helper('catalog/image')->init($product, 'image')->resize(120); ?>"alt="Product image"  />
        </a>
        <br />
    <?php endif; ?>
<?php endforeach; ?>

还能实现已经售出多少件商品的功能

0 Comments | Posted By lei sheng
 
  • Mygod Technologies
  • 麦神科技有限公司
  • 香港中路8号
  • 中铁青岛中心大厦A3001
  • 市南区, 青岛, 266000
  • 电话: 0532-5897-3093

订阅我们的最新消息。

我们将严格尊重您的隐私。

关注我们的微信
获取外贸电子商务最新资讯;跨境推广最新策略;电子商务网站技术最新趋势。

2018 Mygod Technologies. 保留所有权. Privacy Policy