如何使用.htaccess将子域重定向到subdir而不更改URL

时间:2017-05-06 12:05:49

标签: apache .htaccess mod-rewrite url-redirection

有一个域/子域example.com / www.example.com(显然它们都指向/public_html)并且放置在此目录中的网站运行良好。我创建了子网区/public_html/wwwnew和子网区wwwnew.example.com。我希望此子域指向此子文件夹,但我不想更改用户键入的URL(wwwnew.example.com)。当然我需要使用.htaccess

我当前的.htaccess档案:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(wwwnew.)?example.com$
RewriteRule ^(/)?$ wwwnew [L]

RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*) index.php [L]

目前,当我输入wwwnew.example.com网址更改为wwwnew.example.com/wwwnew时。我希望这个/wwwnew消失......

任何帮助?

1 个答案:

答案 0 :(得分:0)

RewriteRule ^(/)?$ wwwnew [L]

如果wwwnew是一个物理子目录(您说它是),那么您应该在RewriteRule susbtition 的末尾添加一个尾部斜杠(最好是索引)文件以及)。如果你不这样做,那么mod_dir将为你附加斜杠(为了“修复”URL)并这样做会触发外部301重定向(你似乎看到了)。虽然这会重定向到wwwnew.example.com/wwwnew/(带有斜杠),但不是wwwnew.example.com/wwwnew,正如您在问题中所述。

RewriteCond %{HTTP_HOST} ^(wwwnew.)?example.com$

但是,您的条件会重写对apex域和子域的请求。在您的描述中,您只描述了从子域重写,而不是顶点域(在其中有另一个站点)。

所以,请尝试以下方法:

RewriteCond %{HTTP_HOST} ^wwwnew\.example\.com
RewriteRule ^$ wwwnew/ [L]

(/)?中不需要.htaccess。虽然,最好,您应该直接重写您要处理此请求的文档(即索引文档)(否则mod_dir必须为您执行此操作)。例如:

RewriteRule ^$ wwwnew/index.php [L]

您需要清除浏览器缓存,因为浏览器会缓存错误的重定向/wwwnew

<强>更新

但是,上面只重写了对裸子域的请求,没有任何URL路径(如问题中所述)。为了将此子域的任何请求(例如wwwnew.example.com/<something>)重写到子目录,您需要执行以下操作:

RewriteCond %{HTTP_HOST} ^wwwnew\.example\.com
RewriteRule !^wwwnew/ wwwnew/index.php [L]

这确保我们不会得到重写循环。