3

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

我使用 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>
4

2 回答 2

0

If the domains in the rewrite rule do not match, then apache will rewrite in the address bar.

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

If it is not in a same directory, you could create a symlink in your domains directory that links to your subdomains directory, which should work. You would need to allow FollowSymlinks or SymLinksIfOwnerMatch if they are not already set.

于 2013-05-10T21:03:37.950 回答
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 代码根本不起作用。希望这可以为其他一些人节省大量的工作、压力和挫折。

祝你好运。:)

于 2013-05-11T20:54:20.497 回答