【问题标题】:Redirect www to non-www on https site using mod rewrite, VirtualHost, and/or Directory使用 mod rewrite、VirtualHost 和/或 Directory 将 www 重定向到 https 站点上的非 www
【发布时间】:2013-10-16 09:17:51
【问题描述】:

这是我在 StackOverflow 上的第一篇文章,所以请多多包涵......

我正在尝试将 www.example.com 重定向到 https://example.com。我在 StackOverflow 和其他论坛网站上查看了很多解决方案,但我似乎无法得到任何工作。以下是我查看过的其他一些 StackOverflow 页面:

Generic htaccess redirect www to non-www

apache redirect from non www to www

Redirect Non-WWW to www

我的 SSL 证书同时列出了 example.com 和 www.example.com。这是我一直在尝试添加重定向的 apache2.conf 文件中的代码:

<Directory /home/tim/examplepath>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ sort-url.php?rt=$1
</Directory>

<VirtualHost XXX.XXX.XX.XXX:12345>
    ServerName example.com
    Redirect / https://example.com/ 
</VirtualHost>

<VirtualHost XXX.XXX.XX.XXX:80>
   ServerName example.com
   Redirect / https://example.com/
</VirtualHost>

<VirtualHost XXX.XXX.XX.XXX:123>
   ServerName example.com
   DocumentRoot /home/tim/examplepath/
   SSLEngine on
   SSLCertificateFile /etc/ssl/certs/example.com.crt
   SSLCertificateKeyFile /etc/ssl/certs/example.key
   SSLCertificateChainFile /etc/ssl/certs/sf_bundle.crt
</VirtualHost>

我希望所有内容都重定向到https://example.com/sort-url.php?rt=$1,然后我可以根据变量 $1 确定要显示的页面。

有人可以告诉我需要做什么吗?里面的 ServerAlias 和里面的 301 重定向对我没有用。

提前谢谢你!

提姆

【问题讨论】:

标签: apache .htaccess mod-rewrite redirect apache2


【解决方案1】:

我必须在我的 Rackspace 帐户的 DNS 记录中添加一个 CNAME。 CNAME 是“www.highschoolclothing.com”。

感谢大家的帮助!

【讨论】:

  • 啊,我假设您的 DNS 记录是最新的。还好你找到了。顺便说一句,您可以接受自己的答案。 :-)
  • 感谢 Qben。 StackOverflow 不会让我在 6 小时内接受我自己的答案,但我现在可以了! :) 根据我的 SSL 检查显示,我认为我的 DNS 记录也很好。我想我误解了一些事情(这是我第一次设置服务器)。我不知道 CNAME 可以用于 www 问题,因为我看到的所有示例都有些不同。不过,我真的很感谢你的帮助。
【解决方案2】:

欢迎来到 SO!

如果您希望 所有内容example.com 结尾,您可以将其设为您的 _default_ 站点。我认为你可以这样做:

<VirtualHost _default_:*>
   Redirect permanent / https://example.com
</VirtualHost>

<VirtualHost XXX.XXX.XX.XXX:123>
   ServerName example.com
   DocumentRoot /home/tim/examplepath/
   SSLEngine on
   SSLCertificateFile /etc/ssl/certs/example.com.crt
   SSLCertificateKeyFile /etc/ssl/certs/example.key
   SSLCertificateChainFile /etc/ssl/certs/sf_bundle.crt

   RewriteEngine On
   RewriteBase /
   # Check is HTTPS is used
   RewriteCond %{HTTPS} =off
   RewriteRule ^(.*)$ https://example.com/sort-url.php?rt=$1 [R=301,L]

   # If we have not specified a file to access, redirect to sort-url.php
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ sort-url.php?rt=$1
</VirtualHost>

我必须承认这是未经测试的,我有点不确定是否需要 VirtualHost 用于重定向到 SSL 的非 SSL 连接。

编辑
更改为默认主机只转发到https://example.com 以确保使用正确的主机名。

【讨论】:

  • 谢谢 Qben。它不喜欢 VirtualHost 中的“RewriteBase /”(仅在目录中表示)。您是在建议我不需要 吗?另外,“%{HTTPS} =off”中是否应该有一个“=”?我仍然被这个问题困扰。如果我找到修复程序会发布...
  • 我想说在这种情况下RewriteBase 可以被删除,因为它与DocumentRoot 相关。是的,它应该说=off,因为如果未启用 HTTPS,您想进行重写。由于您的 DocumentRoot 与您的 Directory 路径相同,因此您应该可以跳过它。基本上我把你的东西从Directory移到了VirtualHost。你能解释一下当你访问www.example.com时会发生什么吗?
  • 当我尝试访问 www.example.com 时,它会将我带到这里:search.dnsassist.verizon.net
  • 我试过你上面提供的代码。当我重新启动 apache 时,它​​通知我 *.80 的虚拟主机不存在。一旦我为端口 80 添加了一个虚拟主机,该站点将我定向到“错误请求”页面......有什么想法吗?我完全被这个难住了。
  • 您似乎使用的是基于 ip 的虚拟主机,而不是基于名称的虚拟主机。 Listen 语句用于哪些端口?
猜你喜欢
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2015-06-15
  • 2020-12-09
  • 1970-01-01
  • 2018-07-25
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多