【问题标题】:htaccess rewrite rules with mod_GeoIPhtaccess 使用 mod_GeoIP 重写规则
【发布时间】:2012-02-25 08:07:12
【问题描述】:

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

2 现在是问题。

每当客户访问结帐或帐户等安全页面时,css 和 javascript 的 URL 都会被重写为 root/ukstore/skin 或 root/ukstore/js。关于这些 URL 的 SSL,我有什么遗漏吗?

其次,如果来自南非的用户访问商店,他们将被重写到英国商店,并且所有 css、js、图像都完美链接回商店/皮肤,但如果来自英国的用户访问商店那么css、js和图片的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>

任何帮助将不胜感激!

【问题讨论】:

  • 您的 css/图片网址是否以斜杠开头,即 /store/skin/my.css 还是 skin/my.css
  • 这是一个magento设置,所以它们实际上是/store/skin/frontend/default/theme/css/my.css。但在 CSS 中它们是 url(../images/bg-main3.jpg)
  • 鉴于 CSS 有一个前导斜杠,第一条规则将防止它被重写。当您说trying to be rewritten to root/ukstore/skin 时,您看到重定向到/ukstore/skin 还是在英国商店的.html 中是这样的?
  • 它实际上被重写为 /ukstore/skin/etc.. 然后给出 404。
  • 根据规则,不应发生重写。如果您可以在开发环境中复制它,我建议打开 RewriteLog 和 LogLevel 以查看正在发生的情况,即虚拟主机中的 RewriteLog "/path-to-logs/logs/rewrite.log"RewriteLogLevel 9

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


【解决方案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} 变量 重写条件。

【讨论】:

    【解决方案2】:

    基于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多