【问题标题】:Redirect http to https and www to non-www in .htaccess将 http 重定向到 https,将 www 重定向到 .htaccess 中的非 www
【发布时间】:2020-05-27 06:59:48
【问题描述】:

首先,我知道对此有很多答案,但我实际上并没有找到一个有效的答案。这就是我现在在.htaccess 文件中的内容,我想提一下它以前有效,但现在不再有效了。

Redirect 301 /unt-de-cacao-de-plaja/filtre/producator/crisnatur/ /ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g

Options +FollowSymlinks

# Prevent Directoy listing
Options -Indexes

# Prevent Direct Access to files
<FilesMatch "(?i)((\.tpl|\.ini|\.log|(?<!robots)\.txt))">
 Require all denied
## For apache 2.2 and older, replace "Require all denied" with these two lines :
# Order deny,allow
# Deny from all
</FilesMatch>

# SEO URL Settings
RewriteEngine On
# If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/

RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=extension/feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=extension/feed/google_base [L]
RewriteRule ^system/download/(.*) index.php?route=error/not_found [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

# FORCE HTTPS AND NON WWW
RewriteEngine on

RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

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

顺便提一下,由于整个结构已更改,我将有很多从旧页面到新页面的重定向 301。

我在网站内重定向的链接带有“www”,例如:

https://www.example.com/unt-de-cacao-de-plaja/filtre/producator/crisnatur/

并且需要重定向到:

https://example.com/ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g

【问题讨论】:

    标签: .htaccess redirect mod-rewrite mod-alias


    【解决方案1】:

    重定向到 https 和非 www

    要将所有请求重定向到 https 和非 www,请使用以下代码而不是之前的代码:

    规范 HTTPS/非 WWW

    <IfModule mod_rewrite.c>
        RewriteCond %{HTTPS} off [OR]
        RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
        RewriteRule (.*) https://example.com/$1 [L,R=301]
    </IfModule>
    

    和以前一样,将此代码放在您网站的根 .htaccess 中。这是它正在做的事情:

    • 检查 mod_rewrite 是否可用

    • 检查 HTTPS 是否关闭,或者请求是否包含 www

    • 如果任一条件匹配,则请求符合条件并被重定向 到https/非www地址

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

    【讨论】:

    • 非常感谢您的帮助,您的解释解决了 https 非 www 重定向的问题!
    • @Daniel。我会一直帮助需要的人。你可以看到我所有的答案。这很容易理解,对您非常有用。非常感谢投票并评论我的回答。在这里查看全部stackoverflow.com/users/8308674/mujahid-bhoraniya?tab=answers
    • 这个答案无法解决规范重定向在配置文件中的错误位置。即使您“更正”了指令,您仍然需要将指令移动到前端控制器之前,否则它根本不会重定向大多数 URL。
    【解决方案2】:

    几个问题,按重要性排序:

    1. 您在文件末尾有规范的 HTTP 到 HTTPS 和 www 到非 www 的重定向。通过将它放在文件的末尾,在您的 front-controller 之后,对于大多数请求来说,它根本不会被处理。 这需要靠近.htaccess 文件的开头,您的前端控制器之前

    2. 您应该避免在同一范围内混合来自 mod_alias (Redirect) 和 mod_rewrite (RewriteRule) 的重定向。不同的模块在整个请求的不同时间执行,尽管它们在配置文件中的顺序很明显。由于其他重定向需要 mod_rewrite,您应该将 mod_alias Redirect 指令转换为使用 RewriteRule

      例如:

      RewriteRule ^unt-de-cacao-de-plaja/filtre/producator/crisnatur/$ /ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g [R=301,L]
      
    3. 您应该在 URL 重定向中包含规范方案和主机名,以避免在以非规范方案或主机名请求“旧”URL 时进行多次重定向。

      例如:

      RewriteRule ^unt-de-cacao-de-plaja/filtre/producator/crisnatur/$ https://example.com/ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g [R=301,L]
      
    4. 取决于您所说的“大量重定向 301”的确切含义 - 一旦您确定请求,您根本不应该在 .htaccess 中执行此操作,而是在服务器端脚本中重定向will 404。这是优先考虑普通网站访问者而不是您的重定向(在每个请求上执行)。


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

    既然您声明这些指令之前有效,那么我假设在您的系统上使用 HTTPS environment 变量是可以的。但请注意,虽然这比较常见,但它是非标准。 (这意味着服务器正在使用某种 SSL 前端/代理。)

    请注意,当请求http://www.example.com/&lt;anything&gt; (HTTP + www) 时,这些规则的顺序将导致双重重定向。如果您正在实施HSTS,这是必要的,否则,您应该颠倒这两个规则以避免这种不必要的双重重定向。

    【讨论】:

    • 感谢您的帮助,这帮助我了解了重定向的实际工作方式。
    • 既然你已经接受了另一个答案,想必%{ENV:HTTPS}毕竟是个问题?尽管您曾说过“它以前有效,但现在不再有效”?那么,这是否发生了变化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2017-03-24
    • 1970-01-01
    • 2013-07-01
    • 2015-05-19
    • 2016-01-07
    相关资源
    最近更新 更多