我想让我的主域名从一个子目录托管(已完成此步骤),即当有人在幕后输入www.example.com/news时,它会转到www.example.com/subdirectory/新闻,但仍将显示为www.example.com/news。
我使用了以下bluehost代码来完成此任务:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/subdirectory/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdirectory/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ subdirectory/index.php [L]
如果我输入www.example.com/news/(注意斜杠),此代码可以正常工作,但如果我只输入www.example.com/news(没有斜线)则不起作用。有什么想法吗?
谢谢。
答案 0 :(得分:1)
我认为问题在于,在Apache重写/ news到/ subdirectory / news之后,它会发现自己的请求与文件系统上的目录匹配,而不是以尾部斜杠结尾。因此它会重定向到包含尾部斜杠的新网址。
问题是,我们确实希望添加traling斜杠以保留规范网址(否则我们最终会/ news和/ news /导致同一个地方 - 不利于相关链接,SEO等) ,就像apache正在做的那样。所以我们必须自己做,添加以下内容:
RewriteCond %{REQUEST_URI} ^/subdirectory/.*[^/]$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^subdirectory/(.*)$ /$1/ [L,R=301]
此规则的条件将匹配以“子目录”开头的任何请求,DO匹配fielsysem上的目录但不以火车斜线结束。 (例如'/ subdirectory / news')。然后重写者发出一个永久重定向到同一条路径,但以斜线结尾并删除'subdiretcory'(例如'/ news /').
然后客户端将发出'/ news /'请求,apache会将其重写为/ subdirectory / news /,并且不会发出重定向,因为它以斜杠结束。
快速测试了这个,似乎可以解决这个问题。
答案 1 :(得分:0)
对你的问题不是一个真正的答案,但
会不会更容易Deny from all
防止Web访问答案 2 :(得分:0)
andrewmabbott是对的,要修复它,您需要使用ProxyPassReverse。这将重写所有重定向以使用正确的地址。
最简单的方法是:
ProxyPassReverse /subdirectory http://www.example.com/
但是,bluehost可能已禁用mod_proxy,在这种情况下,这将无效。