如何从域名中删除www并强制执行https?

时间:2016-07-12 10:33:44

标签: .htaccess mod-rewrite

我想实现两件事

  1. 从域名中删除www
  2. 强制执行https
  3. 即。

    http:// www.example.org  should be redirect to https://example.org
    https:// www.example.org  should be redirect to https://example.org
    

    更新

    我目前正在使用以下.htaccess规则

    <IfModule mod_rewrite.c>
      RewriteCond %{HTTPS} !=on
      RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
      RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
    </IfModule>
    

    此规则会删除网址中的www(如果存在),我会将用户重定向到https。只有当我在网址中有www时才会发生这种情况。如果我使用http://exampl.org访问我的网站,则不会将其重定向到https。我怎样才能实现这两个目标?

    1)从网址

    中删除www

    2)enforece https

    这是我的htaccess文件,我一直在尝试提到的答案,但似乎没有工作

      # ----------------------------------------------------------------------
      # Better website experience for IE users
      # ----------------------------------------------------------------------
    
        # Force the latest IE version, in various cases when it may fall back to IE7 mode
        #  github.com/rails/rails/commit/123eb25#commitcomment-118920
        # Use ChromeFrame if it's installed for a better experience for the poor IE folk
    
        <IfModule mod_headers.c>
          Header set X-UA-Compatible "IE=Edge,chrome=1"
          # mod_headers can't match by content-type, but we don't want to send this header on *everything*...
          <FilesMatch "\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot|ttf|otf|woff|ico|webp|appcache|manifest|htc|crx|oex|xpi|safariextz|vcf)$" >
            Header unset X-UA-Compatible
          </FilesMatch>
        </IfModule>
    
        # ----------------------------------------------------------------------
        # CORS-enabled images (@crossorigin)
        # ----------------------------------------------------------------------
    
        # Send CORS headers if browsers request them; enabled by default for images.
        # developer.mozilla.org/en/CORS_Enabled_Image
        # blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
        # hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/
        # wiki.mozilla.org/Security/Reviews/crossoriginAttribute
    
        <IfModule mod_setenvif.c>
          <IfModule mod_headers.c>
            # mod_headers, y u no match by Content-Type?!
            <FilesMatch "\.(gif|png|jpe?g|svg|svgz|ico|webp)$">
              SetEnvIf Origin ":" IS_CORS
              Header set Access-Control-Allow-Origin "*" env=IS_CORS
            </FilesMatch>
          </IfModule>
        </IfModule>
    
    
        # ----------------------------------------------------------------------
        # Webfont access
        # ----------------------------------------------------------------------
    
        # Allow access from all domains for webfonts.
        # Alternatively you could only whitelist your
        # subdomains like "subdomain.example.com".
    
        <IfModule mod_headers.c>
          <FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css)$">
            Header set Access-Control-Allow-Origin "*"
          </FilesMatch>
        </IfModule>
    
    
        # ----------------------------------------------------------------------
        # Proper MIME type for all files
        # ----------------------------------------------------------------------
    
        # JavaScript
        #   Normalize to standard type (it's sniffed in IE anyways)
        #   tools.ietf.org/html/rfc4329#section-7.2
        AddType application/javascript         js jsonp
        AddType application/json               json
    
        # Audio
        AddType audio/ogg                      oga ogg
        AddType audio/mp4                      m4a f4a f4b
    
        # Video
        AddType video/ogg                      ogv
        AddType video/mp4                      mp4 m4v f4v f4p
        AddType video/webm                     webm
        AddType video/x-flv                    flv
    
        # SVG
        #   Required for svg webfonts on iPad
        #   twitter.com/FontSquirrel/status/14855840545
        AddType     image/svg+xml              svg svgz
        AddEncoding gzip                       svgz
    
        # Webfonts
        AddType application/vnd.ms-fontobject  eot
        AddType application/x-font-ttf         ttf ttc
        AddType font/opentype                  otf
        AddType application/x-font-woff        woff
    
        # Assorted types
        AddType image/x-icon                        ico
        AddType image/webp                          webp
        AddType text/cache-manifest                 appcache manifest
        AddType text/x-component                    htc
        AddType application/xml                     rss atom xml rdf
        AddType application/x-chrome-extension      crx
        AddType application/x-opera-extension       oex
        AddType application/x-xpinstall             xpi
        AddType application/octet-stream            safariextz
        AddType application/x-web-app-manifest+json webapp
        AddType text/x-vcard                        vcf
        AddType application/x-shockwave-flash       swf
        AddType text/vtt                            vtt
    
        # ----------------------------------------------------------------------
        # Gzip compression
        # ----------------------------------------------------------------------
    
        <IfModule mod_deflate.c>
    
          # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
          <IfModule mod_setenvif.c>
            <IfModule mod_headers.c>
              SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
              RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
            </IfModule>
          </IfModule>
    
          # Compress all output labeled with one of the following MIME-types
          <IfModule mod_filter.c>
            AddOutputFilterByType DEFLATE application/atom+xml \
                                          application/javascript \
                                          application/json \
                                          application/rss+xml \
                                          application/vnd.ms-fontobject \
                                          application/x-font-ttf \
                                          application/xhtml+xml \
                                          application/xml \
                                          font/opentype \
                                          image/svg+xml \
                                          image/x-icon \
                                          text/css \
                                          text/html \
                                          text/plain \
                                          text/x-component \
                                          text/xml
          </IfModule>
    
        </IfModule>
    
    
        # ----------------------------------------------------------------------
        # Expires headers (for better cache control)
        # ----------------------------------------------------------------------
    
        # These are pretty far-future expires headers.
        # They assume you control versioning with filename-based cache busting
        # Additionally, consider that outdated proxies may miscache
        #   www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/
    
        # If you don't use filenames to version, lower the CSS and JS to something like
        # "access plus 1 week".
    
        <IfModule mod_expires.c>
          ExpiresActive on
    
        # Perhaps better to whitelist expires rules? Perhaps.
          ExpiresDefault                          "access plus 1 month"
    
        # cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
          ExpiresByType text/cache-manifest       "access plus 0 seconds"
    
        # Your document html
          ExpiresByType text/html                 "access plus 0 seconds"
    
        # Data
          ExpiresByType text/xml                  "access plus 0 seconds"
          ExpiresByType application/xml           "access plus 0 seconds"
          ExpiresByType application/json          "access plus 0 seconds"
    
        # Feed
          ExpiresByType application/rss+xml       "access plus 1 hour"
          ExpiresByType application/atom+xml      "access plus 1 hour"
    
        # Favicon (cannot be renamed)
          ExpiresByType image/x-icon              "access plus 1 week"
    
        # Media: images, video, audio
          ExpiresByType image/gif                 "access plus 1 month"
          ExpiresByType image/png                 "access plus 1 month"
          ExpiresByType image/jpeg                "access plus 1 month"
          ExpiresByType video/ogg                 "access plus 1 month"
          ExpiresByType audio/ogg                 "access plus 1 month"
          ExpiresByType video/mp4                 "access plus 1 month"
          ExpiresByType video/webm                "access plus 1 month"
    
        # HTC files  (css3pie)
          ExpiresByType text/x-component          "access plus 1 month"
    
        # Webfonts
          ExpiresByType application/x-font-ttf    "access plus 1 month"
          ExpiresByType font/opentype             "access plus 1 month"
          ExpiresByType application/x-font-woff   "access plus 1 month"
          ExpiresByType image/svg+xml             "access plus 1 month"
          ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
    
        # CSS and JavaScript
          ExpiresByType text/css                  "access plus 1 year"
          ExpiresByType application/javascript    "access plus 1 year"
    
        </IfModule>
    
        # ----------------------------------------------------------------------
        # ETag removal
        # ----------------------------------------------------------------------
    
        # FileETag None is not enough for every server.
        <IfModule mod_headers.c>
          Header unset ETag
        </IfModule>
    
        # Since we're sending far-future expires, we don't need ETags for
        # static content.
        #   developer.yahoo.com/performance/rules.html#etags
        FileETag None
    
        # ----------------------------------------------------------------------
        # Start rewrite engine
        # ----------------------------------------------------------------------
    
        # Turning on the rewrite engine is necessary for the following rules and
        # features. FollowSymLinks must be enabled for this to work.
    
        # Some cloud hosting services require RewriteBase to be set: goo.gl/HOcPN
        # If using the h5bp in a subdirectory, use `RewriteBase /foo` instead where
        # 'foo' is your directory.
    
        # If your web host doesn't allow the FollowSymlinks option, you may need to
        # comment it out and use `Options +SymLinksIfOwnerMatch`, but be aware of the
        # performance impact: goo.gl/Mluzd
    
        <IfModule mod_rewrite.c>
          Options +FollowSymlinks
        # Options +SymLinksIfOwnerMatch
          RewriteEngine On
        # RewriteBase /
        </IfModule>
    
    
        # ----------------------------------------------------------------------
        # Suppress or force the "www." at the beginning of URLs
        # ----------------------------------------------------------------------
    
        # The same content should never be available under two different URLs -
        # especially not with and without "www." at the beginning, since this can cause
        # SEO problems (duplicate content). That's why you should choose one of the
        # alternatives and redirect the other one.
    
        # By default option 1 (no "www.") is activated.
        # no-www.org/faq.php?q=class_b
    
        # If you'd prefer to use option 2, just comment out all option 1 lines
        # and uncomment option 2.
    
        # IMPORTANT: NEVER USE BOTH RULES AT THE SAME TIME!
    
        # ----------------------------------------------------------------------
    
        # Option 1:
        # Rewrite "www.example.com -> example.com".
    
        #<IfModule mod_rewrite.c>
         # RewriteCond %{HTTPS} !=on
         # RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
         # RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
        #</IfModule>
    
        <IfModule mod_rewrite.c>
          RewriteEngine On
    
            #RewriteCond %{HTTPS} off [OR]
            #RewriteCond %{HTTP:X-Forwarded-SSL} off [OR]
            #RewriteCond %{HTTP_HOST} ^www\.
            #RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
            #RewriteRule ^ https://%1%{REQUEST_URI} [NE, L, R]
    
            #RewriteCond %{SERVER_PORT} ^80$
            #RewriteRule ^(.*)$ https://%{SERVER_NAME} %{REQUEST_URI} [R=301,L]
    
            RewriteCond %{HTTPS} off [OR]
          RewriteCond %{HTTP_HOST} ^www\.
          RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
          RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R]
    
    
            #RewriteCond %{HTTP_HOST} ^(^www\.)
            #RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
            #RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
        </IfModule>
    
        #<IfModule mod_rewrite.c>
        #  RewriteEngine On
        #  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
        #  RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
        #  RewriteCond %{HTTPS} !=on
        #  RewriteCond %{SERVER_PORT} 80
        #  RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]
        #</IfModule>
    
        # ----------------------------------------------------------------------
        # Prevent 404 errors for non-existing redirected folders
        # ----------------------------------------------------------------------
    
        # without -MultiViews, Apache will give a 404 for a rewrite if a folder of the
        # same name does not exist.
        # webmasterworld.com/apache/3808792.htm
    
        Options -MultiViews
    
    
        # ----------------------------------------------------------------------
        # Custom 404 page
        # ----------------------------------------------------------------------
    
        # You can add custom pages to handle 500 or 403 pretty easily, if you like.
        # If you are hosting your site in subdirectory, adjust this accordingly
        #    e.g. ErrorDocument 404 /subdir/404.html
        ErrorDocument 404 /404.html
    
    
        # ----------------------------------------------------------------------
        # UTF-8 encoding
        # ----------------------------------------------------------------------
    
        # Use UTF-8 encoding for anything served text/plain or text/html
        AddDefaultCharset utf-8
    
        # Force UTF-8 for a number of file formats
        AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
    
    
        # ----------------------------------------------------------------------
        # A little more security
        # ----------------------------------------------------------------------
    
        # To avoid displaying the exact version number of Apache being used, add the
        # following to httpd.conf (it will not work in .htaccess):
        # ServerTokens Prod
    
        # "-Indexes" will have Apache block users from browsing folders without a
        # default document Usually you should leave this activated, because you
        # shouldn't allow everybody to surf through every folder on your server (which
        # includes rather private places like CMS system folders).
        <IfModule mod_autoindex.c>
          Options -Indexes
        </IfModule>
    
        # Block access to "hidden" directories or files whose names begin with a
        # period. This includes directories used by version control systems such as
        # Subversion or Git.
        <IfModule mod_rewrite.c>
          RewriteCond %{SCRIPT_FILENAME} -d [OR]
          RewriteCond %{SCRIPT_FILENAME} -f
          RewriteRule "(^|/)\." - [F]
        </IfModule>
    
        # Block access to backup and source files. These files may be left by some
        # text/html editors and pose a great security danger, when anyone can access
        # them.
        <FilesMatch "(\.(bak|config|sql|fla|psd|ini|log|sh|inc|swp|dist)|~)$">
          Order allow,deny
          Deny from all
          Satisfy All
        </FilesMatch>
    
        # Increase cookie security
        <IfModule php5_module>
          php_value session.cookie_httponly true
        </IfModule>
    
    
    
        <IfModule mod_rewrite.c>
            RewriteEngine On
    
            #<IfModule mod_vhost_alias.c>
            #    RewriteBase /
            #</IfModule>
    
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app.php [QSA,L]
    
    
        </IfModule>
    

3 个答案:

答案 0 :(得分:1)

要删除www并强制执行https,您可以使用以下内容:

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R]

选项2,在apache 2.4上你也可以使用它:

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}#%{HTTP_HOST} ^http#(?:www\.)?(.+)$
RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R]

答案 1 :(得分:0)

试试这个:

RewriteCond %{HTTPS} !^on [OR]
Rewritecond %{HTTP_HOST} !^example\.com
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

答案 2 :(得分:0)

最后,我按照htaccess规则进行了操作,正如我的评论中提到的,由于我的环境中存在弹性负载均衡器,其他答案中发布的规则无法正常工作。通过ELB的所有HTTPS请求都将使X-FORWARDED-PROTO的值等于“HTTPS”。

RewriteEngine on
RewriteCond %{HTTP_HOST} www.(.+) [OR,NC]   
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^/?(.*) http s://mydomain.com%{REQUEST_URI} [L,R=301]