通配符子域路径问题

时间:2011-01-24 18:31:38

标签: php javascript .htaccess

我对通配符子域进行了htaccess重写,将foo.domain.com重写为domain.com/index.php?id=foo。这是使用:

完成的
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteCond %{HTTP_HOST} ^((www\.)?([a-z]+)\.)domain\.com [NC]
RewriteRule .? index.php?id=%3 [L]

这样可以正常工作,但网站上的所有内容都以root为参考:

 "/content/imgs/logo.jpg" or "/ajax/upload.php"

通配符子域更改根,所有内容都引用:

"http://foo.domain.com/content/imgs/logo.jpg"

无法找到内容,因为它不在此子域中。

我知道你可以使用html<基数>用于在所有href位置上放置前缀的标记,但这对于ajax请求的javascript没有帮助。

有没有什么可以在htaccess中解决这个问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

我想我可以解决你的问题克里斯托弗!

您的重写条件正在应用于所有包含的内容,例如ass css / js / images等。这意味着它试图将此内容重写为index.php?id =%3而不是style.css。

在条件上方添加 RewriteCond%{REQUEST_FILENAME}!-f 行并将整个条件放在htaccess的底部意味着它只适用于不存在的文件/目录(即仅限于通配符子域)。

尝试以下方法:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteCond %{HTTP_HOST} ^((www\.)?([a-z]+)\.)domain\.com [NC]
RewriteRule ^(.*)$ "http://domain.com/index.php?id=%3" [L,P]

希望这有助于你交配!

W上。

答案 1 :(得分:0)

好的,立即出现一个问题,您没有在重写规则中指定目标域。如果需要重定向除www以外的任何子域的所有请求,则应指定如下:

RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteCond %{HTTP_HOST} ^((www\.)?([a-z]+)\.)domain\.com [NC]
RewriteRule .? http://www.domain.com/index.php?id=%3 [L]

另一个问题是你在foo.domain.com之后忽略了文件路径,所以无论所请求的文件是页面还是图像,所有请求都会被重定向到domain / index.php?id = foo

更好的方法可能是为每个“子域”提供自己的文件夹,例如

RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteCond %{HTTP_HOST} ^((www\.)?([a-z]+)\.)domain\.com [NC]
RewriteRule ^(.*)? http://www.domain.com/%3/$1 [L]

所以像foo.domain.com/content/imgs/logo.jpg这样的路径会指向domain.com/foo/content/imgs/logo.jpg