htaccess使用mod_GeoIP重写规则

时间:2012-02-02 16:44:39

标签: apache .htaccess mod-rewrite url-rewriting geoip

我对有3个不同商店的电子商务网站的mod_geoip存在一些问题。我们在root / store有我们的主店,但在root / ukstore和root / austore也有商店。主根/存储包含/ skin,/ media和/ js目录,其中包含所有css,images和javascripts。使用此当前设置,网址完美地交换基础,但保留URL的其余部分,因此如果来自英国的用户转到root / store / category / product /,它们将被重定向到root / ukstore / category / product / 。

现在出现问题的两件事。

每当客户访问结帐或帐户等安全页面时,css和javascript的URL都会被重写为root / ukstore / skin或root / ukstore / js。对于这些网址的SSL,我是否遗漏了一些内容?

其次,如果来自南非的用户访问商店,他们将被重写到英国商店,并且所有css,js,图像都完美地链接回商店/皮肤,但是如果来自英国的用户访问商店然后css,js和images的URL尝试重写为root / ukstore / skin

以下是root / store中我的htaccess文件中的代码。每个商店也有自己的htaccess文件,但没有太多。

<IfModule mod_geoip.c>
GeoIPEnable On

Options +FollowSymLinks
RewriteEngine on
#skip processing directories
RewriteRule ^store/skin/  - [L,NC]
RewriteRule ^store/media/  - [L,NC]
RewriteRule ^store/js/  - [L,NC]

RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(AQ|AU|MY|BV|BN|BN|MM|KH|CN|CX|CC|CK|GQ|FJ|PF|GU|GW|HM|HK|ID|KI|KR|KP|KR|LA|MO|MY|MH|FM|MM|NR|NC|PG|NZ|NU|NF|PG|CN|PH|PN|WS|SG|SB|KR|LK|BN|TW|TW|AU|TH|TL|TK|TO|TV|VU|VN|VN|WF)$
RewriteCond %{REQUEST_URI} ^/store(/.*)$ [NC]
RewriteRule ^ /austore%1 [L,R]

#UK Store Rewrites
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(AF|AX|AL|DZ|AD|AO|AM|AT|AZ|BH|BD|IS|BY|BE|BJ|BT|BA|BW|IO|BG|BF|BI|GB|CM|ES|CV|CF|TD|GB|KM|CG|CD|CG|CD|CI|HR|CY|CZ|CZ|BJ|DK|DJ|EG|ER|EE|ET|FO|FI|FR|TF|GA|GM|GE|DE|GH|GI|GD|GR|GL|GN|VA|HU|IS|IN|IR|IR|IQ|IE|IL|IT|CI|JO|KZ|KE|KW|KG|LV|LB|LS|LR|LY|LY|LI|LT|LU|MK|MG|MW|MV|ML|MT|MR|MU|MC|MC|MN|ME|MA|MZ|NA|NP|NL|NE|NG|IE|NO|OM|PK|PS|PS|CG|PL|PT|QA|CI|MK|ZA|CD|RE|RO|RU|RW|SH|SM|ST|SA|SN|RS|SC|SL|SK|SI|SO|SO|ZA|ES|SD|SJ|SZ|SE|CH|SY|SY|TJ|TZ|TN|TR|TM|AE|UG|UA|AE|GB|BF|UZ|VA|GB|EH|YE|ZM|ZW)$
RewriteCond %{REQUEST_URI} ^/store(/.*)$ [NC]
RewriteRule ^ /ukstore%1 [L,R]
</IfModule>

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

问题是您在.htaccess上下文中使用重写条件,因此条件应该相对于您所在的目录,这就是为什么重写条件相对于皮肤,js和媒体中提到的问题不匹配。您应该用以下内容替换它们:

RewriteRule ^(skin|media|js)/ - [L,NC]

或,如mod_rewrite指南(http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteRule

中所述
  

如果您希望匹配每个目录中的完整URL路径   (htaccess)RewriteRule,使用%{REQUEST_URI}变量   的RewriteCond。

答案 1 :(得分:0)

基于Ip的重定向可能会失败,通常人们想要的是基于语言的重定向。您可以阅读用户浏览器中配置的语言,只需将其重定向到您的网站所使用的语言即可。就像那样:

RewriteCond %{HTTP:Accept-Language} ^(en|ja|de|zh|fr|it|nl|fi|sv|no) [NC]
RewriteRule ^$ /en [R=303,L,QSA]

你想要的方法是直接访问服务器中的静态文件,这可以通过设置这个条件来实现,因此静态文件不会被重写

RewriteCond %{REQUEST_FILENAME} !-f