我对通配符子域进行了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中解决这个问题?
谢谢。
答案 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