在 .htaccess 中将 http 重定向到 https 并将 www 重定向到非 www
Redirect http to https and www to non-www in .htaccess
首先,我知道有很多关于此的答案,但实际上我没有找到有效的答案。这就是我现在 .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_= [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/ [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
几个问题,按重要性排序:
您在文件末尾有规范的 HTTP 到 HTTPS 和 www 到非 www 重定向。通过将它放在文件的末尾,在您的 前端控制器 之后,对于大多数请求,它根本不会被处理。 这需要靠近 .htaccess
文件的开头,在 你的前端控制器之前。
您应该避免在同一范围内混合来自 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]
您应该在 URL 重定向中包含规范方案和主机名,以避免在非规范请求 "old" 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]
取决于你的意思 "a lot of Redirect 301" - 你根本不应该在 .htaccess
中这样做,而是在你的服务器端脚本中重定向,一旦你有确定请求将是 404。这是为了优先考虑普通站点访问者而不是您的重定向(在每个请求上执行)。
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/ [R=301,L]
既然你说这些指令以前有效,那么我假设在你的系统上使用 HTTPS
environment 变量是可以的。但请注意,虽然这相对常见,但它 非标准 。 (这意味着服务器正在使用某种 SSL front-end/proxy。)
请注意,这些规则的顺序将在请求 http://www.example.com/<anything>
(HTTP + www) 时导致双重重定向。如果您正在实施 HSTS,这是必需的,否则,您应该颠倒这两个规则以避免这种不必要的双重重定向。
Redirect to https and non-www
要将所有请求重定向到 https 和非 www,请使用以下代码代替之前的代码:
规范HTTPS/non-WWW
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule (.*) https://example.com/ [L,R=301]
</IfModule>
和以前一样,将这段代码放在您网站的根目录 .htaccess 中。这是它正在做的事情:
检查 mod_rewrite 是否可用
检查 HTTPS 是否关闭,或者请求是否包含 www
如果任一条件匹配,则请求符合条件并被重定向
到https/non-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]
首先,我知道有很多关于此的答案,但实际上我没有找到有效的答案。这就是我现在 .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_= [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/ [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
几个问题,按重要性排序:
您在文件末尾有规范的 HTTP 到 HTTPS 和 www 到非 www 重定向。通过将它放在文件的末尾,在您的 前端控制器 之后,对于大多数请求,它根本不会被处理。 这需要靠近
.htaccess
文件的开头,在 你的前端控制器之前。您应该避免在同一范围内混合来自 mod_alias (
Redirect
) 和 mod_rewrite (RewriteRule
) 的重定向。不同的模块在整个请求中的不同时间执行,尽管它们在配置文件中有明显的顺序。由于其他重定向需要 mod_rewrite,因此您应该将 mod_aliasRedirect
指令转换为使用RewriteRule
。例如:
RewriteRule ^unt-de-cacao-de-plaja/filtre/producator/crisnatur/$ /ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g [R=301,L]
您应该在 URL 重定向中包含规范方案和主机名,以避免在非规范请求 "old" 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]
取决于你的意思 "a lot of Redirect 301" - 你根本不应该在
.htaccess
中这样做,而是在你的服务器端脚本中重定向,一旦你有确定请求将是 404。这是为了优先考虑普通站点访问者而不是您的重定向(在每个请求上执行)。
RewriteCond %{ENV:HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/ [R=301,L]
既然你说这些指令以前有效,那么我假设在你的系统上使用 HTTPS
environment 变量是可以的。但请注意,虽然这相对常见,但它 非标准 。 (这意味着服务器正在使用某种 SSL front-end/proxy。)
请注意,这些规则的顺序将在请求 http://www.example.com/<anything>
(HTTP + www) 时导致双重重定向。如果您正在实施 HSTS,这是必需的,否则,您应该颠倒这两个规则以避免这种不必要的双重重定向。
Redirect to https and non-www
要将所有请求重定向到 https 和非 www,请使用以下代码代替之前的代码:
规范HTTPS/non-WWW
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule (.*) https://example.com/ [L,R=301]
</IfModule>
和以前一样,将这段代码放在您网站的根目录 .htaccess 中。这是它正在做的事情:
检查 mod_rewrite 是否可用
检查 HTTPS 是否关闭,或者请求是否包含 www
如果任一条件匹配,则请求符合条件并被重定向 到https/non-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]