Addon域和.htaccess文件重定向

时间:2016-11-30 09:10:24

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

我有两个域名:

  1. maindomain.com
  2. www.addondomain.com
  3. .htaccess中的maindomain.com文件具有此重定向

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

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

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

    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文件。

    更新#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]
    

1 个答案:

答案 0 :(得分:0)

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

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

RewriteOptions inherit

这会导致父目录中的mod_rewrite指令被“复制”到当前的.htaccess文件中。这可能有助于您当前的情况,但是,过分依赖mod_rewrite继承通常是一个坏主意,因为它可能导致难以调试的意外结果。请注意,指令实际上是“复制”的,因此您可以找到可能在父目录中工作的RewriteRule 模式,在子目录中不再匹配 - 因此它不是一个神奇的修复程序。此外,在文件系统路径中包含多个.htaccess文件可能会使系统难以管理。最好在根目录中只有一个.htaccess文件。

您尚未声明为什么您需要.htaccess子目录中的其他/images文件。对于域规范化(这是你的指令正在做的所有),它当然不是必需的。理想情况下,您应该在父.htaccess文件中包含必要的指令。

就个人而言,我只是通过maindomain.com阻止(即403 Forbidden)所有请求。这简化了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的另一种方法是在addondomain.com目录树之外创建目录(子域和maindomain.com指向) 。例如:

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