【问题标题】:Redirect subdirectory to subdomain and non-www to www将子目录重定向到子域,将非 www 重定向到 www
【发布时间】:2013-09-18 23:42:59
【问题描述】:

假设我们有一个域 root.com 我在 htaccess 中添加了这些行以将非 www 重定向到 www :

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

我还有一个子域:demo.root.com 所以我在子目录 root/demo 中添加了一个 htaccess 并添加了一些行来将子目录重定向到子域以避免直接访问使用 root.com/demo 或 www.root.com/demo 的子目录是添加的代码:

RewriteCond %{http_host} ^root.com [nc]
RewriteRule ^(.*)$ http://www.root.com/$1 [L,R=301]
RedirectMatch 301 ^/demo/(.*)$ http://demo.root.com/$1

现在结果是:

  • 将非www重定向到主域root.com的www
  • 重定向子目录 /root/demo 到子域 demo.root.com

问题是:

使用此网址:root.com/demo(非 www 版本)不会将我重定向到 demo.root.com,可能是因为有两个重定向:

  • 从非www到www
  • 从子目录到子域

这个组合好像不行

我想要什么?

组合:

  • 能够将主域从非 www 重定向到 www 而不会在子域中出现问题
  • 将子目录重定向到子域

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite http-status-code-301


    【解决方案1】:

    将这两个规则保留在您的主要DOCUMENT_ROOT/.htaccess

    RewriteRule ^demo(/.*|)$ http://demo.root.com$1 [R=301,L,NC]
    
    RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
    RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

    demo/.htaccess 中删除现有规则。

    【讨论】:

    • 感谢您的帮助,但是当我尝试访问主域 www.root.com 时尝试您的解决方案时,它会显示 500 错误
    • 您能否从您的 error.log 中看到报告的错误并告诉我错误是什么。
    • 它显示:"/home/dir/public_html/.htaccess: RewriteRule: bad flag delimiters" 注意我使用的是Joomla的htaccess
    • 哦,你也有 Joomla。确保将这些规则放在首位,即在常规 Joomla 规则之前。另外请告诉我您尝试使用哪个 URL 来测试此规则?
    • 我刚刚在我的 Apache 上重新测试了这段代码,它工作的文件。请按照我上面的建议,告诉我您在测试中使用的 URL。