2

我有两个域:

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

中的.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.png404 错误。不知何故,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]
4

1 回答 1

0

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

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

RewriteOptions inherit

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

您没有说明为什么需要在子目录中添加附加.htaccess文件。/images对于域规范化(这是您的指令所做的一切),这当然不是必需的。理想情况下,您应该在父.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创建目录(子域和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
于 2016-11-30T18:05:23.320 回答