我的.htaccess rewriterule有一个问题:
服务器细节:
服务器运行LiteSpeed Webserver而不是Apache,根据我的主机提供商,它与apache mod_rewrite 100%兼容。
问题:
使用此代码时出现500内部服务器错误:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteRule ^(.*)$ %2/$1 [L,QSA,NC]
</IfModule>
当我使用这段代码时,它几乎可以做到这一点,它也可以将来自任何子域的流量重定向到带有文件请求的相应子文件夹。没有错误,没有任何工作正常但它也改变了我不希望的浏览器地址。
<IfModule mod_rewrite.c>
Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteRule ^(.*)$ http://mysite.com/%2/$1 [L,QSA,NC]
</IfModule>
有什么想法吗?
Editetd:我想提一点的是,我使用通配符DNS,子域名不存在。 再次编辑:RewriteRule ^(。*)$%2 / index.php [L,QSA,NC]如果我使用此规则并尝试访问http://sub.mysite.com/whatever它会成功将其重定向到http://mysite.com/sub/index.php i不明白为什么当我改变它们时,它不能用$ 1而不是index.php工作,我得到500内部服务器错误。
立即获得解决方案:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{HTTP_HOST} ^(.*)mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.* [NC]
RewriteRule ^(.*)$ http://www.%1mysite.com/$1 [R=301,L,QSA] [NC]
RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteCond %2==$1 !^(.*)==\1
RewriteRule ^(.*) %2/$1$2$3 [L,QSA,NC]
</IfModule>
答案 0 :(得分:0)
这是因为它创建了一个无限的重写循环。
123.mysite.com/
被重写为123.mysite.com/123/
,会被重写为123.mysite.com/123/123/
等。
尝试使用它来阻止此循环:
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteRule ^(.*)$ %2/$1 [L,QSA,NC]
答案 1 :(得分:0)
我认为你的规则应该像这样重写:
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} !^(www\.)?mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.mysite\.com$ [NC]
RewriteRule ^ http://mysite.com/%2%{REQUEST_URI} [L,P]
P标志会使其充当代理,并将浏览器中的网址保留为subdomain.mysite.com/whatever
而不是mysite.com/subdomain/whatever
答案 2 :(得分:0)
这是一个有趣的通用问题,值得一般解决方案,所以如何:
#
# Rule matches ('fred','','') for pattern 'fred'
# ('123','/',fred') for pattern '123/fred'
# At cond 2 %2 is the subdomain e.g. 123 for www.123.mysite.com
# Hence cond 3 pattern is 123==123 for www.123.mysite.com/123/fred
# and this will match ^(.*?)==\1 or fail its negation
#
RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteCond %2==$1 !^(.*?)==\1
RewriteRule ^([^/]*)(/?)(.*) %1/$1$2$3 [L]