如何将旧域名重定向到新域名,同时保持旧域名在浏览器的地址栏中可见?

时间:2013-05-10 19:44:03

标签: apache .htaccess mod-rewrite redirect

我正在尝试将旧域重定向到新的子域,同时尝试在浏览器的地址栏中保持旧域可见。

我使用htaccess来做这件事,除了在地址栏中保持旧域可见外,一切正常。

另一件重要的事情是需要维护url和GET变量中的文件夹。

我正试图通过htaccess优雅地完成这一切,因为我不想使用i-frame来实现这一目标。

这是我到目前为止使用的代码。它可以工作,除了在浏览器的地址栏中维护旧域名。

我的问题是,如何在重定向后继续在浏览器的地址栏中显示旧域名?我在某处读过这可以通过所谓的“代理内容”来完成,但我可能错了。我也不知道它是如何工作的。

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^domain.com [nc]
RewriteRule ^(.*)$ http://subdomain.domain.com/$1 [r=301,nc,L]

RewriteCond %{HTTP_HOST} ^www.domain.com [nc]
RewriteRule ^(.*)$ http://subdomain.domain.com/$1 [r=301,nc,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>

更新

好的,所以我更进了一步。当我将网站文件放在根目录的子目录中时,以下代码有效。

然而,它仍然存在问题。虽然它将example.com重定向到example.com/subdirectory,但它不会将example.com/index.php重定向到example.com/subdirectory/index.php。

我仍在尝试弄清楚如何使用它以适用于所有文件,包括index.php。

#Redirect  a domain to a subdirectory, while displaying only the domain and not the  subdirectory in the browser address bar.
<IfModule mod_rewrite.c>

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^example.com [nc]
RewriteRule ^$ /subdirectory/ [nc,L,QSA]

RewriteCond %{HTTP_HOST} ^www.example.com [nc]
RewriteRule ^$ /subdirectory/ [nc,L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

还有一点需要注意。由于我网站中的所有元素都使用相对路径,因此我必须将HTML根目录设置到子目录中以使工作正常,因为由于重写网站HTML的相对路径正在查看文件的错误根目录。即它们链接到实际的根目录,而不是子目录。我将html root / base设置为子目录,如下所示:

<head>
<base href="http://<?php echo $_SERVER['HTTP_HOST']; ?>/subdirectory/" />
</head>

更新

好的,所以我更进了一步。当我将网站文件放在根目录的子目录中时,以下代码有效。

然而,它仍然存在问题。虽然它将example.com重定向到example.com/subdirectory,但它不会将example.com/index.php重定向到example.com/subdirectory/index.php。

我仍在尝试弄清楚如何使用它以适用于所有文件,包括index.php。

#Redirect  a domain to a subdirectory, while displaying only the domain and not the  subdirectory in the browser address bar.
<IfModule mod_rewrite.c>

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^example.com [nc]
RewriteRule ^$ /subdirectory/ [nc,L,QSA]

RewriteCond %{HTTP_HOST} ^www.example.com [nc]
RewriteRule ^$ /subdirectory/ [nc,L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

还有一点需要注意。由于我网站中的所有元素都使用相对路径,因此我必须将HTML根目录设置到子目录中以使工作正常,因为由于重写网站HTML的相对路径正在查看文件的错误根目录。即它们链接到实际的根目录,而不是子目录。我将html root / base设置为子目录,如下所示:

<head>
<base href="http://<?php echo $_SERVER['HTTP_HOST']; ?>/subdirectory/" />
</head>

2 个答案:

答案 0 :(得分:0)

如果重写规则中的域不匹配,则apache将在地址栏中重写。

 RewriteCond %{HTTP_HOST} ^(www\.)?domain.com
 RewriteRule ^(.*)$ subdomain_directory/$1 [QSA L]

如果它不在同一目录中,您可以在域目录中创建一个链接到您的子域目录的符号链接,该目录应该有效。如果尚未设置,则需要FollowSymlinksSymLinksIfOwnerMatch

答案 1 :(得分:0)

更新2:

这段代码似乎对我有用:

#Redirect a domain to a subdirectory, while displaying only the domain and not the subdirectory in the address bar of a browser
<IfModule mod_rewrite.c>

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com
RewriteCond %{REQUEST_URI} !/subdirectory/
RewriteRule ^(.*)$ /subdirectory/$1 [L]

</IfModule>

这段htaccess代码确实打破了网站代码中的html路径,但这可以通过在网站标题中添加html基本标记来重新定义html基本路径来抵消:

<head>
<base href="http://www.mydomain.com/subdirectory/" />
</head>

此外,您必须特别注意网站的Javascript代码中的路径/链接,以使其能够正常工作。

关于PHP中的路径,您需要使用相对路径来保持网站的PHP代码在重定向后正常工作。

我花了两天的时间来解决这个问题只有4个小时的睡眠时间,因为很多在线可用的htaccess代码根本无效。希望这会为其他人节省很多工作,压力和挫折。

祝你好运。 :)