![无需更改 URL 即可将网页重定向到另一个网站](https://linux22.com/image/723598/%E6%97%A0%E9%9C%80%E6%9B%B4%E6%94%B9%20URL%20%E5%8D%B3%E5%8F%AF%E5%B0%86%E7%BD%91%E9%A1%B5%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%BD%91%E7%AB%99.png)
我有一个域名 (example2.com),用于将用户引导到同一服务器上另一个网站的特定页面 (example.com/page2)。我按照本文中的说明进行操作创建重定向而不更改 URL,参见示例 2,但一定是哪里做错了,因为我收到的影响要么是错误消息,要么是它在 index.html 上加载了虚拟内容。当我删除 index.html 时,我收到:
未找到所请求的 URL / 未在此服务器上找到”,正如人们所预料的那样,没有 index.html。
我已经在 apache 中设置了一个新的 vhost,方法是example2.com.conf
在 sites-available 中创建一个,并在 sites-enabled 中创建一个符号链接。我创建了一个虚拟 index.html 并在文件中定义了 docroot example2.com.conf
。到目前为止一切正常,虚拟内容已加载。
我在 example2.com 的 docroot 中的文件的全部内容.htaccess
如下:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example2.com
RewriteRule ^(.*) http://www.example.com/page2 [P]
我希望域名加载的页面上的任何链接都是外部的,或者允许正常转到 example.com。这是一个无品牌的合作伙伴项目页面,使用 Drupal 构建。域名 (example2.com) 需要加载 (example.com/page2),但在地址栏中显示 example2.com。这是域名的唯一内容,因此我仅为其创建了一个 docroot,以便测试虚拟内容并创建 .htaccess。
Apache 和 Debian 9。
我也尝试了这篇文章中的一些建议,其中很多建议都说不能使用 .htaccess 文件来实现。我也尝试了下面答案中的建议。
注意:随着我越来越接近解释我想做的事情,这个问题已经经过重大改写。
答案1
可以。有多种方法可以实现此目的。
一种方法是配置一个真正的虚拟域 example2.com,并仅设置重定向选项以将所有内容重定向到您想要的位置。这实际上是更简单、更轻松的方法(mod_rewrite 更像“重型火炮”)。
IE
<VirtualHost *:80>
ServerName example2.com
Redirect / http://example.com/page2
</VirtualHost>
DigitalOcean 似乎推荐这种方法。
当然,实际的重定向条件可能会改变。
另一种方法是学习如何配置 mod_rewrite。只要你的 mod_rewrite 正确加载,并且你的配置部分确实会收到请求(即正确设置 VirtualHost 或主服务器),并且没有其他 mod_rewrite 指令可以干预此指令,你就可以使用类似下面的方法:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example2\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/page2/$1 [L,R]
要仅加载主页,您可以替换 RewriteRule 中的 .* 匹配条件,即仅捕获索引页(“空请求”):
RewriteRule ^$ http://example.com/page2 [L,R]
(或者应该是 ^/$?我不知道,都试试)。
https://stackoverflow.com/questions/13021893/htaccess-mod-rewrite-hostname
请注意,这两个选项的行为有所不同。第一个选项将告诉用户代理加载另一个 URL,因此用户可以注意到他们已移至另一个地址。第二个选项将向用户呈现其他地址的内容,就好像它位于第一个位置一样,即用户将看到 example2.com 域名,但页面将来自 example.com/page2。他们无法知道该页面是否在其他地址可用。因此,页面包含包含的媒体(css、图像、字体),您也必须为它们提供重写规则或仅对它们使用绝对 URI。
我个人建议关注 Apache 开发人员并避免 mod_rewrite如果可能的话(另见这个答案)。
看官方文档也是 mod_rewrite 的一部分。请注意,此模块是功能模块,因此请谨慎使用。
答案2
如果您想在显示来自不同域的页面时保留 URL,则需要反向代理。
mod_proxy 是最直接的解决方案,具体描述如下反向代理指南。
<VirtualHost *:80> ServerName example.net ProxyPass "/" "http://www.example.com/page2/" ProxyPassReverse "/" "http://www.example.com/page2/" </VirtualHost>
mod_rewrite
RewriteRule
还有一个代理标志,你可以使用它来避免重定向:proxy
P
:强制将替换 URL 作为代理请求在内部发送。RewriteCond %{HTTP_HOST} ^example.net RewriteRule ^(.*) http://example.com/page2 [P]
如果网站位于同一台服务器上,那么应该可以指向DocumentRoot
直接地:
<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www"
</VirtualHost>
<VirtualHost *:80>
ServerName example.net
DocumentRoot "/var/www/page2"
</VirtualHost>