首页 文章

通用htaccess将www重定向到非www

提问于
浏览
459

我想将 www.example.com 重定向到 example.com . 以下htaccess代码实现了这一点:

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

但是,有没有办法以通用方式执行此操作而不对域名进行硬编码?

21 回答

  • 2
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^/(.*)$ http://%1/$1 [R]
    

    RewriteCond在"www."之后捕获HTTP_HOST变量中的所有内容并将其保存在%1中 . RewriteRule捕获URL(没有领先"/")并将其保存在$ 1中 .

  • 2

    如果你想在httpd.conf文件中执行此操作,则可以在没有mod_rewrite的情况下执行此操作(显然它对性能更好) .

    <VirtualHost *>
      ServerName www.example.com
      Redirect 301 / http://example.com/
    </VirtualHost>
    

    我在这里得到了答案:https://serverfault.com/questions/120488/redirect-url-within-apache-virtualhost/120507#120507

  • -1
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]
    

    对于子文件夹

  • 7

    选择的答案和许多其他解决方案在/之后删除了网址的部分,所以基本上它总是重定向到主域,至少对我来说..所以我在斜线后添加工作样本尊重完整路径..

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [L,R=301]
    
  • 102

    www到非www与https

    RewriteEngine on
    
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    
    RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
  • 1

    但是如果我们需要为单独的http和https执行此操作:

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    
    RewriteCond %{HTTPS} on
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
    
  • 3

    试试这个:

    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteRule ^(.*)$ %{HTTP_HOST}$1 [C]
    RewriteRule ^www\.(.*)$ http://$1 [L,R=301]
    

    如果主机以www开头,我们将整个主机粘贴到URL的开头,然后取下“www” .

  • 3

    non-www 重定向到 www (两者:http https)

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    
    RewriteCond %{HTTPS} on
    RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
    
  • 815

    对于那些需要能够访问整个网站 WITHOUT 'www'前缀的人 .

    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]
    

    确保您将此添加到以下文件中

    /site/location/.htaccess
    
  • 44

    我开始工作的唯一方法......

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^site\.ro
    RewriteRule (.*) http://www.site.ro/$1 [R=301,L]
    
  • 0
    RewriteEngine on
    # if host value starts with "www."
    RewriteCond %{HTTP_HOST} ^www\.
    # redirect the request to "non-www"
    RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]
    

    如果要在 httphttps 上删除 www ,请使用以下命令:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.
    RewriteCond %{HTTPS}s ^on(s)|offs
    RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]
    

    这会重定向Non ssl

    和SSL

    在apache 2.4.* 上你可以用 Redirectif 指令完成这个,

    <if "%{HTTP_HOST} =='www.example.com'">
    Redirect / http://example.com/
    </if>
    
  • 3

    以下是将www URL重定向到no-www的规则:

    #########################
    # redirect www to no-www
    #########################
    
    RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
    RewriteRule ^(.*) http://%1/$1 [R=301,NE,L]
    

    以下是将无www URL重定向到www的规则:

    #########################
    # redirect no-www to www
    #########################
    
    RewriteCond %{HTTP_HOST} ^(?!www\.)(.+) [NC]
    RewriteRule ^(.*) http://www.%1/$1 [R=301,NE,L]
    

    请注意,我使用了 NE 标志来阻止apache转义查询字符串 . 如果没有此标志,apache会将请求的URL http://www.example.com/?foo%20bar 更改为 http://www.example.com/?foo%2250bar

  • 0

    完整的通用WWW处理程序,http / https

    我没有看到完整的答案 . 我用它来处理WWW包含 .

    • 通用 . 不需要域信息 .

    • 在主域名上强制WWW:www.domain.com

    • 删除子域名上的WWW:sub.domain.com

    • 保留HTTP / HTTPS状态 .

    • 允许域/子域的单个cookie

    请让我知道这是如何工作的,或者我是否留下了漏洞 .

    RewriteEngine On
    RewriteBase /
    
    # Force WWW. when no subdomain in host
    RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
    RewriteCond %{HTTPS}s ^on(s)|off [NC]
    RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    # Remove WWW. when subdomain(s) in host     
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteCond %{HTTPS}s ^on(s)|off [NC]
    RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
    RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
    
  • 1

    这已更新为适用于Apache 2.4:

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

    唯一的变化vs Michael's是删除 [NC] ,这会产生"AH00665"错误:

    不支持非正则表达式模式'-f'的NoCase选项,将被忽略

  • 6
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    

    Michael's相同,但这个有效:P

  • 11

    我不知道你为什么要删除www . 但反向版本将是:

    # non-www.* -> www.*, if subdomain exist, wont work
    RewriteCond %{HTTP_HOST} ^whattimein\.com
    RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]
    

    这个脚本的优点是:如果你有像test.whattimein.com或其他任何东西(用于开发/测试的环境),它不会将U重定向到原始环境 .

  • 1

    我使用上面的规则将www转到没有www并且它适用于主页,但是在内部页面上它们转发到/index.php

    我在我的.htaccess文件中发现了另一个规则,这导致了这个但不知道如何处理它 . 任何建议都会很棒:

    ############################################
    ## always send 404 on missing files in these folders
    
        RewriteCond %{REQUEST_URI} !^/(media|skin|js)/
    
    ############################################
    ## never rewrite for existing files, directories and links
    
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-l
    
    ############################################
    ## rewrite everything else to index.php
    
        RewriteRule .* index.php [L]
    
  • 69

    如果你强迫www . 在url或强制ssl prototcol,然后尝试使用htaccess文件中的可能变体,例如:

    RewriteEngine On
    RewriteBase /
    
    ### Force WWW ###
    
    RewriteCond %{HTTP_HOST} ^example\.com
    RewriteRule (.*) http://www.example.com/$1 [R=301,L]
    
    ## Force SSL ###
    
    RewriteCond %{SERVER_PORT} 80 
    RewriteRule ^(.*)$ https://example.com/$1 [R,L]
    
    ## Block  IP's ###
    Order Deny,Allow
    Deny from 256.251.0.139
    Deny from 199.127.0.259
    
  • 5

    我发现,有很多关于htaccess重定向的错误信息 . 首先,如果您希望此代码能够运行,请确保您的站点在使用Apache的Unix上运行,而不是在Windows主机上运行 .

    RewriteEngine On
    
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    

    (但请确保每行文本之间没有行间距;我在行之间添加了一个额外的空格,以便在此窗口中呈现正常 . )

    这是一段代码,可用于将您网站的www版本指向http://版本 . 还可以使用其他类似的代码 .

  • 33

    使用:Javascript / jQuery

    // similar behavior as an HTTP redirect
    window.location.replace("http://www.stackoverflow.com");
    // similar behavior as clicking on a link
    window.location.href = "http://stackoverflow.com";
    

    或.htaccess:

    RewriteEngine On
    RewriteBase /
    Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
    RewriteRule ^(.*)$ https://yoursite.com/$1 [R=301,L]
    

    和PHP方法:

    $protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";
    
    if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
        header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
        exit;
    }
    

    阿贾克斯

    $.ajax({
        type: "POST",
        url: reqUrl,
        data: reqBody,
        dataType: "json",
        success: function(data, textStatus) {
            if (data.redirect) {
                // data.redirect contains the string URL to redirect to
                window.location.href = data.redirect;
            }
            else {
                // data.form contains the HTML for the replacement form
                $("#myform").replaceWith(data.form);
            }
        }
    });
    
  • 3

    您好,您可以在您的htaccess文件中使用以下规则:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^example.com
    RewriteRule (.*) http://www.example.com/$1 [R=301,L]
    

相关问题