【问题标题】:Addon domain and .htaccess file redirect插件域和 .htaccess 文件重定向
【发布时间】:2017-04-14 12:45:55
【问题描述】:

我有两个域:

  1. maindomain.com
  2. www.addondomain.com

maindomain.com 中的 .htaccess 文件具有此重定向

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?maindomain\.com)$ [NC]
RewriteRule .? http://%1%{REQUEST_URI} [R=301,L]

它将 www 重定向到非 www 版本。

addondomain.com 中的另一个 .htaccess 文件有这些重定向

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^addondomain.com$
RewriteRule ^(.*)$ "http\:\/\/www\.addondomain\.com\/$1" [R=301,L]
RewriteCond %{HTTP_HOST} ^addondomain\.maindomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.addondomain\.maindomain\.com$
RewriteRule ^(.*)$ "http\:\/\/www\.addondomain\.com\/$1" [R=301,L]
RewriteCond %{HTTP_HOST} ^maindomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.maindomain\.com$
RewriteRule ^(.*)$ "http\:\/\/www\.addondomain\.com\/$1" [R=301,L]

所有页面都可以很好地重定向,但是当我将另一个 .htaccess 文件放在子目录中时,重定向不起作用。所以,我把这些规则写在image子目录中。

RewriteCond %{HTTP_HOST} ^addondomain.com$
RewriteRule ^(.*)$ "http\:\/\/www\.addondomain\.com\/$1" [R=301,L]
RewriteCond %{HTTP_HOST} ^addondomain\.maindomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.addondomain\.maindomain\.com$
RewriteRule ^(.*)$ "http\:\/\/www\.addondomain\.com\/$1" [R=301,L]
RewriteCond %{HTTP_HOST} ^maindomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.maindomain\.com$
RewriteRule ^(.*)$ "http\:\/\/www\.addondomain\.com\/$1" [R=301,L]

现在,当我尝试访问 addondomain.maindomain.com/image/1.png 时,它会重定向到 addondomain.maindomain.com/1.png,并出现 404 错误。不知何故,image 目录丢失了。我需要另一个.htaccess 子目录中的文件。

UPDATE#1: addondomain 也是maindomain 的子域,目录结构是:

/public_html
    .htaccess
    home.php (page of main domain)
    /addondomain.com (directory)
        home.php (page of addondomain)
        .htaccess
        /image (directory)
            .htaccess
            1.png

更新#2:

如果我这样设置.htaccess,这会起作用:

RewriteCond %{HTTP_HOST} ^(www\.)?maindomain\.com$ [NC]
RewriteRule ^(.*)$ http://www.addondomain.com/image/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^addondomain.com$
RewriteRule ^(.*)$ http://www.addondomain.com/image/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^addondomain\.maindomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.addondomain\.maindomain\.com$
RewriteRule ^(.*)$ http://www.addondomain.com/image/$1 [R=301,L]

有什么方法可以使用一些代码(我有点新)代替图像

RewriteRule ^(.*)$ http://www.addondomain.com/.*$/$1 [R=301,L]

【问题讨论】:

  • 能否请您提供您的目录结构。您的addondomain.com 是否指向maindomain.com 文档根目录的子目录? .htaccess 文件沿文件系统路径继承,但是默认情况下不继承 mod_rewrite 指令。通常最好避免子目录中有多个.htaccess 文件。
  • “不知怎的,图像文件夹被切断了。” - 您在图像子目录中的规则不包括替换中的“图像”文件夹,因此这就是图像文件夹被“切断”的原因。使用目录前缀会更容易(在.htaccess 中),而不是显式指定绝对 URL。
  • " 使用目录前缀会更容易(在 .htaccess 中),而不是明确指定绝对 URL" 如何使用目录前缀,可以添加一些代码
  • 为什么要在addondomain.com 的子目录中再放一个.htaccess?大概你做的不仅仅是域规范化?您需要重定向所有内容吗?例如,就个人而言,我会简单地 403 对maindomain.com/addondomain.com/ 的所有请求。您是否还有其他需要考虑的子域?
  • (抱歉,我对目录前缀的评论不适用于此处,因为您正在规范化域。)

标签: .htaccess redirect mod-rewrite addon-domain


【解决方案1】:

虽然.htaccess 文件(通常)是沿文件系统路径“继承”的,但 mod_rewrite 指令不是(默认情况下)。子目录中.htaccess 文件中的 mod_rewrite 指令将完全覆盖父目录中的指令。这就是您必须在多个 .htaccess 文件中复制指令的原因。

但是,您可以使用子目录中.htaccess 文件中的RewriteOptions 指令“继承”父指令。例如:

RewriteOptions inherit

这会导致来自父目录的 mod_rewrite 指令被“复制”到当前的.htaccess 文件中。这可能对您当前的情况有所帮助,但是,过度依赖 mod_rewrite 继承通常是一个坏主意,因为它可能导致难以调试的意外结果。请注意,指令实际上是“复制”的,因此您会发现可能在父目录中有效的 RewriteRule patterns 在子目录中不再匹配 - 所以这不是一个神奇的修复。此外,在文件系统路径上有多个 .htaccess 文件会使系统难以管理。根目录下最好只有一个.htaccess 文件。

您没有说明为什么您需要在/images 子目录中添加一个额外的.htaccess 文件。对于域规范化(这是您的指令所做的一切),这当然不是必需的。理想情况下,您应该在父 .htaccess 文件中包含必要的指令。

就个人而言,我会简单地阻止(即 403 禁止)通过 maindomain.com 的所有请求。这简化了addondomain.com/.htaccess 文件:

RewriteEngine On

# Block all access via maindomain.com
RewriteCond %{HTTP_HOST} \.maindomain\.com$ [OR]
RewriteRule ^ - [F]

# Canonicalise www.addondomain.com
RewriteCond %{HTTP_HOST} =addondomain\.com$
RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L]

# Any additional rewrites relating to the /image subdirectory (for example)
#RewriteRule ^image/(.+) /get-image.php?file=$1 [L]

避免maindomain.com 干扰addondomain.com 的另一种方法是在maindomain.com 目录树之外创建目录(子域和addondomain.com 指向的目录)。例如:

/public_html
    .htaccess
    home.php (page of main domain)
/addondomain.com (directory)
    home.php (page of addondomain)
    .htaccess
    /image (directory)
        1.png

【讨论】:

  • 通过addondomain.com访问时,上述内容不应该触发403吗? (RewriteOptions 指令只是一个示例,我不建议在您当前的配置中使用它 - 它不应该是必需的。但是您还没有解释您到底在做什么用这个设置?你只是 规范化域?)
猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 2018-02-16
  • 2011-10-14
  • 2016-10-26
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
相关资源
最近更新 更多