分类 Web 技术 下的文章

Thumb

PrestaShop在nginx服务器下的伪静态规则

最近把web服务器换成了nginx,但是发现prestashop的图片怎么都不能显示,但是如果关掉伪静态,图片又能正常显示。想来想去就觉得问题应该是出在伪静态规则上。后来在网上找到了解决办法,只要把下面的代码放入nginx的对应网站的配置文件里就ok啦~

For PrestaShop 1.5.x (1.6.x没测试,不过个人感觉是兼容的)

rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
rewrite ^/([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$1$2$3.jpg last;
rewrite ^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$1$2$3$4.jpg last;
rewrite ^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$1$2$3$4$5.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5$6.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9$10.jpg last;
rewrite ^/c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2$3.jpg last;
rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2.jpg last;
rewrite ^/images_ie/?([^/]+)\.(jpe?g|png|gif)$ /js/jquery/plugins/fancybox/images/$1.$2 last;
try_files $uri $uri/ /index.php$is_args$args;
error_page 404 /index.php?controller=404;

For PrestaShop 1.4.x

rewrite ^/([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2$3.jpg last;
rewrite ^/([0-9]+)\-([0-9]+)/([_a-zA-Z0-9-]*)\.jpg$ /img/p/$1-$2.jpg last;
rewrite ^/([0-9]+)(\-[_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)\.jpg$ /img/c/$1$2.jpg last;
rewrite "^/lang-([a-z]{2})/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$" /product.php?id_product=$3&isolang=$1$5 last;
rewrite "^/lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$" /product.php?id_product=$2&isolang=$1$4 last;
rewrite "^/lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /category.php?id_category=$2&isolang=$1 last;
rewrite ^/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 last;
rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$1$3 last;
rewrite ^/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /category.php?id_category=$1 last;
rewrite ^/content/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$ /cms.php?id_cms=$1 last;
rewrite ^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$ /supplier.php?id_supplier=$1$3 last;
rewrite ^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$ /manufacturer.php?id_manufacturer=$1$3 last;
rewrite "^/lang-([a-z]{2})/(.*)$" /$2?isolang=$1 last;
Thumb

使用伪静态后,PHP无法使用$_SERVER['SERVER_PORT']获取真实端口

今天无意间遇到这么个问题,就是在使用伪静态后,$_SERVER['SERVER_PORT']无法获取到服务器真实的端口。起先以为是程序问题,但是后来关了程序的伪静态功能后,发现又能正确获取到端口,所以就写了个简单的测试脚本。

在localhost根目录下建个 index.php 文件,内容为:

同一目录下再建个 .htaccess 文件,内容为:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^test$ /index.php
</IfModule>
server_port-1
图1

测试环境:XAMPP 1.7.3 (Apache 2.2.14 + PHP 5.3.1)

测试结果如图1

询问了半天 Google 和百度两兄弟,都没结果,正郁闷之时,突然想起还有官方的帮助文档有很多人会留言,于是去看看。结果,不看不知道,这下子可让我发现新大陆了。原来官网文档(E文)上关于“SERVER_PORT”还有这样一段文字:

Note: Under the Apache 2, you must set UseCanonicalName = On, as well as UseCanonicalPhysicalPort = On in order to get the physical (real) port, otherwise, this value can be spoofed and it may or may not return the physical port value. It is not safe to rely on this value in security-dependent contexts. 
server_port-2
图2

大概意思是说:在 Apache2 下必须要将 UseCanonicalName 和 UseCanonicalPhysicalPort 都设置为 On 才能获取到真实的端口。

这下知道原因了,剩下的就是改 Apache 配置文件了。不过要说明下,配置文件里,可能只能找到 UseCanonicalName,而找不到 UseCanonicalPhysicalPort,当然这不需要担心,只要手动加上就可以了。注意,如果只改了 UseCanonicalName 而没有改 UseCanonicalPhysicalPort 的话,就连不使用伪静态都无法获取到真实端口的!

然后再运行上面测试脚本,结果就应该如图2所示。然后,就没有然后啦~~哈哈~

Thumb

IE6下使用DD_belatedPNG修复透明png图片后引发的bug

首先我们必须承认使用DD_belatedPNG是目前在处理IE6下使用透明png图片的最好解决办法。这一方法在中国特色的互联网环境下,还是很有用的!但是,话说回来,这毕竟是使用第三方的脚本来进行处理的,兼容性自然不可能做到完美,自然也会存在一定的bug。下面就来说说本人在使用这一脚本后遇到的问题以及解决办法。

  1. position为relative的对象上使用,会使该对象的position的值会被替换成:absolute
    示例代码:
    <div class="png_bg" style="position:relative; background:url(xxx.png) no-repeat 0 0;"></div>

    解决办法:在这个对象外面再包裹一层,并将position放到这个包裹对象上。例:
    <div style="position:relative;">
    <div class="png_bg" style="background:url(xxx.png) no-repeat 0 0;"></div>
    </div>
  2. img对象上使用会导致onclick事件失效
    示例代码:
    <img src="xxx.png" class="png_bg" onclick="javascript:xxx();" />

    解决办法:使用链接,将onclick事件放到链接上。例:
    <a href="javascript:xxx();"><img src="xxx.png" class="png_bg" /></a>
  3. a:hover的背景图片无法修复。这个问题,是我觉得很奇怪的,因为官网上明明写着,支持a:hover的
    示例代码:
    <style>
    a{background:url(xxx.png) no-repeat 0 0;}
    a:hover{background:url(xxx_hover.png) no-repeat 0 0;}
    </style>
    <a href="#" class="png_bg">链接</a>

    解决办法:我使用的是最原始的办法——filter。需要注意background的先后顺序以及第二个background和filter之前的下划线,都是必须的。例:
    <style>
    a{background:url(xxx.png) no-repeat 0 0;}
    a:hover{background:url(xxx_hover.png) no-repeat 0 0; _background:none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="xxx.png" ,sizingMethod="crop");}
    </style>
    <a href="#" class="png_bg">链接</a>

以上是我个人遇到的一些问题和解决办法,也欢迎大家来补充和指正哈~

Thumb

Apache虚拟主机的六种配置方法

基于不同情况下配置Apache虚拟主机的方法,一共八种情况。首先查看你虚拟主机属于哪一种情况,然后对号入座就好了。过程不复杂,关键在于对症下药。

1、基于ip地址的虚拟主机

Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot /home/httpd/html1
ServerName www.ok1.com
ErrorLog /usr/local/apache/logs/error1_log
CustomLog /usr/local/apache/logs/access1_log combined
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot /home/httpd/html2
ServerName www.ok2.com
ErrorLog /usr/local/apache/logs/error2_log
CustomLog /usr/local/apache/logs/access2_log combined
</VirtualHost>

2、基于IP 和多端口的虚拟主机配置

Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080
<VirtualHost 172.20.30.40:80>
DocumentRoot /www/example1-80
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot /www/example1-8080
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot /www/example2-80
ServerName www.example1.org
</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot /www/example2-8080
ServerName www.example2.org
</VirtualHost>

3、单个IP 地址的服务器上基于域名的虚拟主机配置

# Ensure that Apache listens on port 80
Listen 80
# Listen for virtual host requests on all IP addresses
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example1.com
ServerAlias example1.com. *.example1.com
# Other directives here
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here
</VirtualHost>

4、在多个IP 地址的服务器上配置基于域名的虚拟主机

Listen 80
# This is the "main" server running on 172.20.30.40
ServerName server.domain.com
DocumentRoot /www/mainserver
# This is the other address
NameVirtualHost 172.20.30.50
<VirtualHost 172.20.30.50>
DocumentRoot /www/example1
ServerName www.example1.com
# Other directives here ...
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here ...
</VirtualHost>

5、在不同的端口上运行不同的站点(基于多端口的服务器上配置基于域名的虚拟主机)

Listen 80
Listen 8080
NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080
<VirtualHost 172.20.30.40:80>
ServerName www.example1.com
DocumentRoot /www/domain-80
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example1.com
DocumentRoot /www/domain-8080
</VirtualHost>
<VirtualHost 172.20.30.40:80>
ServerName www.example2.org
DocumentRoot /www/otherdomain-80
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example2.org
DocumentRoot /www/otherdomain-8080
</VirtualHost>

6、基于域名和基于IP 的混合虚拟主机的配置

Listen 80
NameVirtualHost 172.20.30.40
<VirtualHost 172.20.30.40>
DocumentRoot /www/example1
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot /www/example2
ServerName www.example2.org
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot /www/example3
ServerName www.example3.net
</VirtualHost>

 

原文:http://jingyan.baidu.com/article/363872ec870f6e6e4ba16feb.html