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



我想实现两件事

  1. 从域名中删除 www
  2. 强制执行 HTTPS

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>

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

1) 从网址中删除万维网

2) Enforce 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>

试试这个:

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

要删除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]

最后,我使用以下 htaccess 规则工作,正如我的评论中所述,由于我的环境中存在弹性负载均衡器,其他答案中发布的规则不起作用。所有通过ELB的HTTPS请求的X-转发-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]

最新更新