未输入 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 的第一条规则中有几个“错误”,这会导致问题:

  1. 您在规则中缺少 L 标志,因此处理将继续并可能被重写,从而导致格式错误的重定向(可能导致 404)。

  2. 您正在重定向到 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-路径。但是,所述正则表达式不会将这些排除在捕获组之外。