未输入 www 时未找到 404
404 not found when not typing www
在地址栏 前面没有 www 的情况下输入我的域时,我收到了 404。只有 Mac 上的 Safari 似乎工作正常,但 Chrome 和 Firefox 得到 404 未找到。为什么会这样,我该如何更改它?
domain.nl
在 Safari 中有效,但 returns 404 在 Chrome/Firefox/etc 中有效。
www.domain.nl
适用于所有浏览器。
Chrome/Firefox/etc.
非 www 版本不会自动更改为 www 版本
RewriteEngine On
# AUTO HTTP TO HTTPS
RewriteCond %{HTTP_HOST} ^domain\.nl$
RewriteRule ^(.*) http://www.domain.nl/ [R=301]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\?*$ index.php?_route_= [L,QSA]
# FOR NON-WWW QUERIES
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/ [R=301,L]
请注意:我已将代码中的实际域替换为文本“域”。
# AUTO HTTP TO HTTPS
RewriteCond %{HTTP_HOST} ^domain\.nl$
RewriteRule ^(.*) http://www.domain.nl/ [R=301]
您在将非 www 重定向到 www 的第一条规则中有几个“错误”,这会导致问题:
您在规则中缺少 L
标志,因此处理将继续并可能被重写,从而导致格式错误的重定向(可能导致 404)。
您正在重定向到 HTTP,而不是 HTTPS。
第一条规则应为:
RewriteCond %{HTTP_HOST} ^domain\.nl
RewriteRule (.*) https://www.domain.nl/ [R=301,L]
# FOR NON-WWW QUERIES
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/ [R=301,L]
你的最后一条规则是多余的,可以删除,因为这是第一条规则的作用!除了这条规则更笼统,没有明确包括域名。
或者,将第一条规则替换为这条规则。但是,如果您有其他子域,则此规则不一定有效,除非您希望所有子域也具有 www 子域?
您需要在测试前清除浏览器缓存,因为浏览器会缓存任何错误的 301(永久)重定向。 (首先测试 302 - 临时 - 重定向以避免潜在的缓存问题。)
缓存可能解释您所看到的浏览器行为的差异?
旁白:
RewriteRule ^(.*)\?*$ index.php?_route_= [L,QSA]
您在此处使用的正则表达式有点“奇怪”,可能没有按照您的预期进行。正则表达式 ^(.*)\?*$
与 (.*)
相同,因为 .*
是 greedy 而 \?*
实际上是 optional(匹配 0 次或更多次),因此 .*
消耗(并且 (.*)
捕获)整个 URL-path 无论如何。
正则表达式末尾 \?*$
的存在似乎表明您期望 %3F
(URL 编码 ?
)在 URL-路径。但是,所述正则表达式不会将这些排除在捕获组之外。
在地址栏 前面没有 www 的情况下输入我的域时,我收到了 404。只有 Mac 上的 Safari 似乎工作正常,但 Chrome 和 Firefox 得到 404 未找到。为什么会这样,我该如何更改它?
domain.nl
在 Safari 中有效,但 returns 404 在 Chrome/Firefox/etc 中有效。
www.domain.nl
适用于所有浏览器。
Chrome/Firefox/etc.
非 www 版本不会自动更改为 www 版本RewriteEngine On
# AUTO HTTP TO HTTPS
RewriteCond %{HTTP_HOST} ^domain\.nl$
RewriteRule ^(.*) http://www.domain.nl/ [R=301]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\?*$ index.php?_route_= [L,QSA]
# FOR NON-WWW QUERIES
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/ [R=301,L]
请注意:我已将代码中的实际域替换为文本“域”。
# AUTO HTTP TO HTTPS RewriteCond %{HTTP_HOST} ^domain\.nl$ RewriteRule ^(.*) http://www.domain.nl/ [R=301]
您在将非 www 重定向到 www 的第一条规则中有几个“错误”,这会导致问题:
您在规则中缺少
L
标志,因此处理将继续并可能被重写,从而导致格式错误的重定向(可能导致 404)。您正在重定向到 HTTP,而不是 HTTPS。
第一条规则应为:
RewriteCond %{HTTP_HOST} ^domain\.nl
RewriteRule (.*) https://www.domain.nl/ [R=301,L]
# FOR NON-WWW QUERIES RewriteCond %{HTTP_HOST} !^www\. RewriteRule (.*) https://www.%{HTTP_HOST}/ [R=301,L]
你的最后一条规则是多余的,可以删除,因为这是第一条规则的作用!除了这条规则更笼统,没有明确包括域名。
或者,将第一条规则替换为这条规则。但是,如果您有其他子域,则此规则不一定有效,除非您希望所有子域也具有 www 子域?
您需要在测试前清除浏览器缓存,因为浏览器会缓存任何错误的 301(永久)重定向。 (首先测试 302 - 临时 - 重定向以避免潜在的缓存问题。)
缓存可能解释您所看到的浏览器行为的差异?
旁白:
RewriteRule ^(.*)\?*$ index.php?_route_= [L,QSA]
您在此处使用的正则表达式有点“奇怪”,可能没有按照您的预期进行。正则表达式 ^(.*)\?*$
与 (.*)
相同,因为 .*
是 greedy 而 \?*
实际上是 optional(匹配 0 次或更多次),因此 .*
消耗(并且 (.*)
捕获)整个 URL-path 无论如何。
正则表达式末尾 \?*$
的存在似乎表明您期望 %3F
(URL 编码 ?
)在 URL-路径。但是,所述正则表达式不会将这些排除在捕获组之外。