【问题标题】:Redirect Subdomain Using htaccess and Keep URL使用 htaccess 重定向子域并保留 URL
【发布时间】:2012-08-14 20:00:47
【问题描述】:

我已经搜索过,虽然我发现很多线程都关闭了,但没有一个是我正在寻找的......

在我的网站上,例如 example.com,我创建了子域 secure.example.com

此子域将具有 SSL。

我想要做的是将请求重定向到 https://secure.example.com/path/ 到 www.example.com/path/,同时保持 url 显示为 https://secure.example.com/path/

注意 subdomain.example.com 的目的是为了 SSL,所以上面的重定向需要使用 SSL

我想在 htaccess 中使用其他一些重定向: 1)将非www重定向到www忽略子域(所以secure.example.com不会变成www.secure.example.com) 2) 将/index.php 重定向到/ 3)最后但并非最不重要的一点是,在secure.example.com上强制使用SSL

此外,购物车软件还有其他功能和 SEO 的 htaccess 语句,如下所示。

我当前的根 htaccess:

# Prevent Directoy listing 
Options -Indexes

# Prevent Direct Access to files
<FilesMatch "\.(tpl|ini|log)">
 Order deny,allow
 Deny from all
</FilesMatch>

# Turn Rewrite Engine On
RewriteEngine On

## index.php to root
Options +FollowSymlinks
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.example.com/ [R=301,L] 

## non-www to www ignore subdomains
RewriteCond %{HTTP_HOST} ^example.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

【问题讨论】:

  • example.comsecure.example.com 是否在同一主机和同一文档根目录上?你有加载 mod_proxy 吗?
  • 是的,它们位于同一主机和同一文档根目录上。子域实际上是根设置下带有子域的子文件夹。在我的主机的帮助下,我们现在可以正确解析并安装 SSL。
  • 唯一剩下的就是我原来帖子中的重定向。至于 mod_proxy,我不知道,但我敢打赌它没有安装。我给我的主人寄了一张票来确定一下。
  • 我的主机说安装了 mod_proxy。我的 Apache 配置显示这些已安装:proxy_module(静态)proxy_connect_module(静态)proxy_ftp_module(静态)proxy_http_module(静态)proxy_ajp_module(静态)proxy_balancer_module(静态)

标签: security .htaccess redirect ssl subdomain


【解决方案1】:

嗯,专门为 url https://secure.example.com/path/ 显示在 http://www.example.com/path/ 找到的内容,你可以做 2 件事。最好的情况是,如果这 2 个域是从同一个文档根目录提供的:

它们位于同一主机和同一文档根目录上。子域实际上是根设置下带有子域的子文件夹。在我的主机的帮助下,我们现在可以正确解析并安装 SSL。

子目录可能有问题,因为它可能无法out 重写它自己的文档根目录。例如:

  • -> 文档根目录
  • www.example.com -> /path/to/htdocs
  • secure.example.com -> /path/to/htdocs/secure

如果您在 /path/to/htdocs/secure 中有一个 .htaccess 文件来重写对 https://secure.example.com/ 的请求。这里的问题是您需要重写到父目录,而 apache 不会让您这样做。如果反过来,您可以将http://www.example.com/ 的请求重写为/secure。此外,如果两个域具有相同的文档根,您也可以重写。但如果 secure 是 www 的文档根目录的子目录,则不会。

我的主机说安装了 mod_proxy。我的 Apache 配置显示这些已安装:proxy_module(静态)proxy_connect_module(静态)proxy_ftp_module(静态)proxy_http_module(静态)proxy_ajp_module(静态)proxy_balancer_module(静态)

这意味着您至少可以使用P rewrite 标志将请求发送到 mod_proxy,因此您可以执行以下操作:

RewriteEngine On
RewriteRule ^path/$ http://www.example.com/path/ [L,P]

在您的secure.example.com 文档根目录的htaccess 文件中。这只会专门代理 URI /path/,而不是像 /path/foo/bar.html 这样的任何东西。如果你想要所有以/path/ 开头的东西,那么你可以匹配它:

RewriteRule ^path/(.*)$ http://www.example.com/path/$1 [L,P]

如果存在重定向问题,您可能需要改用ProxyPass

ProxyPass / http://www.example.com/
ProxyPassReverse / http://www.example.com/

它做同样的事情,只是它重写了位置标头,所以重定向也被代理了。

【讨论】:

  • 谢谢。我尝试了(SSL 和非 SSL)但一无所获。我仍然在secure.example.com 中看到我的测试文件,而不是example.com 中的那个。看着你的帖子,我刚刚意识到一些事情,我并不是说“路径”会在字面上存在,我使用路径作为secure.example.com 之后的任何内容
  • @Bob 您可以将path/ 从正则表达式和RewriteRule 的目标中远程。
  • 我删除了“路径/”,现在它可以部分工作了。 SSL 警告页面仅部分加密。该证书属于 secure.example.com 并且页面上指向实际域 (www.example.com) 的链接返回 404。
  • 404 消失了。根 htaccess 导致了这种情况。但部分安全的警告仍然存在。
  • @Bob 这可能是由使用 FQDN 的 www.example.com 域中的链接引起的,例如:&lt;img src=http://www.example.com/images/foo.jpg&gt;,这会引发该警告。
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多