使用某些参数重定向子域和主站点的文件请求?

时间:2011-10-05 10:21:52

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

我正在运行通配符子域。该网站的目的是运行虚拟子域。功能应该是什么时候文件  从主站点调用它们将被重写为干净的URL。但是当我从子域调用相同的文件时 像xyz.doamin.com/my-file.php然后这应该被重写,就像它调用具有subdoamin参数的文件一样 domain.com/my-file.php?var=xyz。目前我为文件调用所做的是这个

Options +FollowSymLinks
RewriteEngine on

## Redirecting all non-www domains to www.domain.com
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,NC,L]


RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^(.*)$   http://www.domain.com%{REQUEST_URI}?var=%1 [L]


RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC]
RewriteCond %{QUERY_STRING}  !^$
RewriteRule ^(.*)$   http://www.domain.com%{REQUEST_URI}?%{QUERY_STRING}&var=%1 [L]



RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^(.*)$   http://www.domain.com/index.php?subdomain=%1 [L]


RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC]
RewriteCond %{QUERY_STRING}  !^$
RewriteRule ^(.*)$   http://www.domain.com%{REQUEST_URI}?%{QUERY_STRING}&subdomain=%1 [L]

这会给文件调用带来500内部错误。

1 个答案:

答案 0 :(得分:0)

规则集4将与规则集1和2重叠。我怀疑这是导致问题的原因。 所以我认为所有3人都需要对RewriteCond进行额外的REQUEST_URI检查。

真的你不应该需要规则集4.只需将index.php作为默认值就可以了。除非你当然不想像http://www.domain.com/?var=xyz这样的网址,在这种情况下你需要规则4,但你需要将它分成2 - 一个QUERY_STRING而一个没有,就像规则1和2

此外,重写规则本身的正则表达式不是%1而不是之前的rewriteConds?如果是这样,那么你的正则表达式是错误的,因为它会将var=设置为整个原始网址。

查看错误日志是一个好主意,因为它会告诉您500错误的原因。

编辑:好的,尝试这样的事情(未经测试)

## Redirecting all non-www domains to www.domain.com
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L,QSA]

## Redirecting / requests to index.php
# Note: Use the QSA flag for handling with or without query string
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC]
RewriteRule ^(.*)$   http://www.domain.com/index.php?var=%1 [L,QSA]

## Redirecting /something requests to index.php
# Note: Use the QSA flag for handling with or without query string
RewriteCond %{REQUEST_URI} ^/.+$
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC]
RewriteRule ^(.*)$   http://www.domain.com%{REQUEST_URI}?var=%1 [L,QSA]