无需更改 URL 即可将网页重定向到另一个网站

无需更改 URL 即可将网页重定向到另一个网站

我有一个域名 (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 文件来实现。我也尝试了下面答案中的建议。

https://stackoverflow.com/questions/987343/how-can-i-redirect-to-a-different-domain-without-changing-the-url-in-the-address

注意:随着我越来越接近解释我想做的事情,这个问题已经经过重大改写。

答案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_rewriteRewriteRule还有一个代理标志,你可以使用它来避免重定向:

    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>

相关内容