Apache 重写模块

Apache 重写模块

我正在尝试实现虚拟子域名,因为我的托管服务提供商对我可以拥有的子域名数量设置了限制!我已经有一个通配符 DNS 条目,因此所有子域名都被接受并发送到我的域名的根目录。以下是我在 .htaccess 中输入的内容,用于处理重定向:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^(www|admin).* [NC]
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+)\.domain\.-com
RewriteCond /home/username/public_html/subdomain/%1 -d
RewriteRule ^(.*) /home/username/public_html/subdomain/%1/$1

问题出在执行实际重定向的最后一行,服务器显示 500(内部服务器错误),但 apache 错误日志未展开该错误。如果我将以下内容放入其中:

RewriteRule ^(.*) index.php?path=/home/username/public_html/subdomain/%1/$1

它运行良好...并且路径是正确的文件路径。

答案1

虽然有点晚了,但这是我的问题的完整答案。如果你用完了子域名,这是一个非常方便的脚本。

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} !^[www|admin] [NC]
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+)\.domain\.com [NC]
RewriteRule (.*) /subdomain/%1/$1 [L]

请注意以下实际 URL:http://virtual.domain.com/index.phphttp://www.domain.com/subdomain/virtual/index.php

答案2

我建议:

  • 首先测试它是否是子域名(就像你做的那样),如果是,则在 /subdomain/(realsubdomain) 上进行测试
  • 然后如果是(www 或 admin),则拒绝所有尝试访问 /subdomain/xxx 的用户

请注意我删除了(/home/username/public_html

所以这应该接近:

RewriteEngine on
# first handle subdomains
RewriteCond %{HTTP_HOST} !^(www|admin)\.* [NC]
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+)\.domain\.com
RewriteCond /home/username/public_html/subdomain/%1 -d
RewriteRule (.*) /subdomain/%1/$1
# then in main domains:
RewriteCond %{HTTP_HOST} ^(www|admin)\.* [NC]
# ...refuse access to subdomain:
RewriteRule ^/subdomain(.*) - [R=404,L]

注意:这是一个 404 重定向,因此您可以在重写规则的最开始处创建自己的 404,如下所示:

ErrorDocument 404 /404.php
RewriteEngine on
RewriteRule /404.php - [QSA,L]
... blabla...

并在您的 404.php 处理 URL 以显示一些好消息:)

两个提示:


请尝试使用该RewriteLog指令:它可以帮助您追踪此类问题:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

我最喜欢的检查正则表达式的工具:

http://www.quanetic.com/Regex(不要忘记选择 ereg(POSIX)而不是 preg(PCRE)!)

相关内容