我正在尝试在 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.html
http://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]