【问题标题】:.htaccess Only for www. Subdomain.htaccess 仅适用于 www。子域
【发布时间】:2012-06-21 02:02:32
【问题描述】:

如何构造我的 .htaccess 文件,以便它将 www 添加到地址 mysite.com 的开头,但不添加 www。到 test.mysite.com 等其他子域的开头?我的 .htaccess 文件目前如下所示:

Options -Multiviews
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php

【问题讨论】:

    标签: php apache .htaccess


    【解决方案1】:

    类似:

    RewriteCond %{HTTP_HOST} ^mysite.com
    

    代替

    RewriteCond %{HTTP_HOST} !^www\.
    

    【讨论】:

    • 如果不是使用 ttp://www.%{HTTP_HOST}/$1 会这么简单,因为这似乎意味着域可以是可变的......跨度>
    • 虽然我可能是错的,然后你的答案绝对是最简单和最明显的选择
    • 缺乏可配置性可以通过设置适当的SERVER_NAME来克服,在这种情况下,该行很可能是RewriteCond %{HTTP_HOST} ^%{SERVER_NAME}
    • 抱歉没说清楚;域名不可变。您能解释一下您的解决方案现在如何工作吗?
    • 在当前状态下,它只是检查域是否以mysite.com开头,然后才遵循RewriteRule。如果您有一个很小的机会,您将拥有一个mysite.com.mysite.com 子域,请将其锚定在两端(RewriteCond %{HTTP_HOST} ^mysite.com$),因此重定向到 www 的规则。仅当主机名完全“mysite.com”时才会生效。附带说明:我怀疑您拥有mysite.comexample.com 是为这种事情保留的;)
    【解决方案2】:

    我只是不知道只获取域命名字符的该死规则,所以我会尝试这个,但它可能会在某些主题上失败:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^[a-zA-Z0-9\-]+(\.[a-z]{2,4})+$
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ $1.php
    

    这将强制所有以一个单词和一个 TLD 开头的域被转发到 www.samedomain.tld 但不会命中子域...

    【讨论】:

    • 我的解决方案允许您在多域站点上运行此代码,但有一些限制。例如 4 个字符或更少字符的主域(例如:sex.com 仍会在 my.sex.com 上被命中,因为 my 将符合第一条规则,而 .sex.com 将在最后符合重复规则)
    • .museum 是我所知道的当前最长的 tld,并且有很多国家使用双精度,例如 .co.uk...
    • 双打最后由 (...)+ 处理,但博物馆,那是一个新的。在那种情况下,我们不能真正使用我的解决方案......
    • 那个,[a-zA-Z0-9\-]+www 匹配的事实;)我认为在 RewriteRules 中不可能进行后向分析,但这些可能会克服这一点,我会检查一下。
    • 请注意,不,前瞻和家族很遗憾不能在这里使用(POSIX 正则表达式与 mod_rewrite 中的 PCRE 正则表达式相反)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2015-08-18
    • 2014-03-31
    • 2015-08-13
    • 2016-11-12
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多