htaccess rewrite规则和mod_GeoIP

14

我在为一个包含三个不同商店的电子商务网站使用mod_geoip时遇到了一些问题。我们有一个主要商店位于根目录下 /store,但也有位于 /ukstore 和 /austore 目录下的商店。主要的 /store 目录包含 /skin、/media 和 /js 子目录,其中包含所有的 CSS、图片和 JavaScript 文件。在当前的设置下,URL 可以无缝切换基础路径,但保留其余部分,因此如果一个来自英国的用户访问 root/store/category/product/,他们将被重定向到 root/ukstore/category/product/。

现在存在两个问题。

首先,每当客户访问像结账或账户这样的安全页面时,CSS 和 JavaScript 的 URL 就会被重写为 root/ukstore/skin 或 root/ukstore/js。是否有关于那些 URL 的 SSL 我忽略了什么?

其次,如果一个来自南非的用户访问商店,则会被重写到英国商店,并且所有的 CSS、JS 和图片都与 store/skin 链接完美匹配,但是如果一个来自英国的用户访问该商店,则 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/图片URL是否以斜杠开头,例如/store/skin/my.css,还是skin/my.css - Ulrich Palha
这是一个Magento设置,所以它们实际上是/store/skin/frontend/default/theme/css/my.css。但在CSS中,它们是url(../images/bg-main3.jpg)。 - coloradohiker
3
根据规定,不应进行重写。如果您可以在开发环境中复制此操作,建议在虚拟主机中打开RewriteLog和LogLevel以查看正在发生的情况,即:RewriteLog "/path-to-logs/logs/rewrite.log"RewriteLogLevel 9 - Ulrich Palha
我使用以下代码行:RewriteRule ^(skin|js) - [L,NC] 来解决这个问题。相比上面列出的处理规则,您认为这个配置有什么问题吗? - coloradohiker
你应该回答自己的问题并接受它,因为它仍然显示为未回答,而问题似乎已经解决了。 :) - Qben
显示剩余2条评论
2个回答

1
问题在于你正在使用.htaccess上下文中的重写条件,因此条件应该相对于你所在的目录,这就是为什么与皮肤、js和媒体相关的重写条件在问题中不匹配的原因。你应该用类似以下内容替换它们:
RewriteRule ^(skin|media|js)/ - [L,NC]

或者,正如在mod_rewrite指南中提到的(http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteRule)

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接