我正在尝试创建一个动态子域名,但遇到了很大困难,我一直收到 500 内部服务器错误
例如实际域名应该是
http://www.parameterToBePassed.domain.com/
应该指向/重定向
http://www.domain.com/shopping/gatename/parameterToBePassed
但是当我访问此 URL 时出现内部服务器错误 (500),有什么想法吗?
vhost.conf 包含
ServerAlias www.domain.com domain.com *.domain.com
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !www.domain.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).domain.com [NC]
RewriteRule (.*) http://www.domain.com/shopping/gatename/$1 [L]
</IfModule>
我正在使用 Redhat Linux 和 Plesk
答案1
(不久前我回答过类似的帖子,尽管这里的情况略有不同)
假设某人去a.domain.com
。这符合两个条件。
主要问题:您的重写规则匹配空输入......
于是,a.domain.com
遵守规则就变成a.domain.com/shopping/gatename/
。
然后它返回到服务器再次,并匹配再次两种情况都满足。URL 变为a.domain.com/shopping/gatename/shoppin/gatename/
。
你注意到了吗?它用请求的值替换,而不是你在第二个 RewriteCond 中捕获的值,这就是你的另一个问题。
你能重复使用 捕获的组RewriteCond
,但它们前面是%
,而不是$
。因此,您真正想要的是这个(带有完整的正则表达式元字符等加上锚点):
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
# Non capturing group for "www." if present: it is of no interest
RewriteCond %{HTTP_HOST} ^(?:www\.)([a-z0-9-]+)\.domain\.com$ [NC]
RewriteRule (.*) http://www.domain.com/shopping/gatename/%1/$1 [L] # Note the %!