使用 mod_rewrite 替代 VirtualHosts 在一个 GoDaddy 托管账户上托管两个域名

使用 mod_rewrite 替代 VirtualHosts 在一个 GoDaddy 托管账户上托管两个域名

我正在尝试在 GoDaddy 托管的网站上使用 mod_rewrite 执行类似 VirtualHosts 的操作。我有一个托管帐户和两个域名,a.com 和 b.com。我希望 b.com/document.html 的请求由 ~/html/b_site/document.html 提供(其中 ~/html/ 是 DocumentRoot,用作 a.com 的根目录)。我找到了一个参考mod_rewrite 文档中的这个用例表明这是可行的,但我没有成功。以下是 ~/html/.htaccess 的内容:

RewriteEngine on
Options FollowSymLinks

RewriteCond %{HTTP_HOST} b\.com$
RewriteBase /
RewriteRule ^(.*)$ b_site$1

结果是,当我将浏览器指向 b.com 时:位置栏更改为 b.com/b_site/ 并且服务器响应 500。以下 RewriteRule 运行正常,没有任何问题:

RewriteRule ^(.*)$ b_site/index.html

...这仍然是我唯一能得到除了 500 或重定向循环警告之外的结果的方法。RewriteBase 行似乎没有什么区别。

为了找出匹配的内容,我编写了一个简单的 PHP 脚本,它可以接受查询参数并打印它,并且我使用了这个 RewriteRule:

RewriteRule ^(.*)$ b_site/index.php?q=$1

输出显示,在这种情况下,RewriteRule 匹配“b_site/index.php”。RewriteBase 文档确实暗示应该发生类似的事情,但同样,RewriteBase 似乎对结果没有影响。类似问题一切似乎都归结于我正在尝试的同一种机制。

有什么想法吗?

答案1

您的.htaccess上下文以及都为 设定了的RewriteBase上下文;这意味着您的替换将接受 的请求并从 提供该请求- 可能不会起作用。RewriteRule/http://b.com/dir_a/page.htmlhttp://b.com/b_sitedir_a/page.html

来自文档

在 .htaccess 文件中使用重写引擎时,每个目录的前缀(对于特定目录始终相同)将在 RewriteRule 模式匹配中自动删除,并在任何相对(不以斜杠或协议名称开头)替换遇到规则集结尾后自动添加。

尝试这个:

RewriteCond %{HTTP_HOST} ^b\.com$ [NC]
RewriteRule ^(.*)$ b_site/$1

答案2

解决了。​​不用感谢 GoDaddy 让您为访问错误日志付费!

当我看到其他人的日志。现在我清楚了递归是如何发生的,以及为什么事情会被重写第二次(并且无限递归,导致 500)。有一个很好的方法可以解决递归问题这里(来自 serverfault 用户 Dave Drager 的回答回答类似的问题)。

我稍微简化了一下并得出了这个解决方案:

RewriteEngine 在
选项 FollowSymLinks
RewriteCond %{ENV:REDIRECT_X} =""
RewriteCond %{HTTP_HOST} b.com$ [NC]
RewriteRule ^(.*)$ b_site/$1 [E=X:1,L]

相关内容