当我在地址栏中输入我的域名时,它的前面没有www,我得到了404。只有Mac上的Safari看起来工作得很好,但Chrome和Firefox却没有找到404。为什么,我该怎么改变呢?
domain.nl在Safari中工作,但在Chrome/Firefox/等等中返回404。
www.domain.nl适用于所有浏览器。
在Chrome/Firefox/等等中,非www版本不会自动更改为www版本。
RewriteEngine On
# AUTO HTTP TO HTTPS
RewriteCond %{HTTP_HOST} ^domain\.nl$
RewriteRule ^(.*) http://www.domain.nl/$1 [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_=$1 [L,QSA]
# FOR NON-WWW QUERIES
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R=301,L]请注意:我已经用代码中的文本“域”替换了实际的域。
发布于 2021-09-22 20:02:41
自动HTTP到HTTPS RewriteCond %{HTTP_HOST} ^domain.nl$ RewriteRule ^(.*) http://www.domain.nl/$1 R=301
在您的第一个规则中,有几个“错误”将非www重定向到www,这些错误会导致问题:
L标志,因此处理将继续进行,并可能被重写,从而导致格式错误的重定向(这可能导致404)。第一条规则应为:
RewriteCond %{HTTP_HOST} ^domain\.nl
RewriteRule (.*) https://www.domain.nl/$1 [R=301,L]非www的
查询RewriteCond %{HTTP_HOST} !^www.RewriteRule (.*) https://www.%{HTTP_HOST}/$1 R=301,L
您的最后一个规则是多余的,可以删除,因为这是第一个规则所做的!但是,这条规则比较一般,并且不显式地包括域名。
或者,用这条规则代替第一条规则。但是,如果您有其他子域,则此规则不一定有效,除非您希望所有子域也具有www子域?
测试前,您需要清除浏览器缓存,因为浏览器将缓存任何错误的301 (永久)重定向。(首先用302进行测试--临时重定向,以避免潜在的缓存问题。)
缓存可以解释您所看到的浏览器行为的差异吗?
撇开:
RewriteRule ^(.*)?$ index.php?_route_=$1 L,QSA
您在这里使用的正则表达式有点“奇怪”,可能没有执行您认为它正在做的事情。regex ^(.*)\?*$与简单的(.*)相同,因为.*是贪婪的,\?*实际上是可选的(匹配0次或更多次),因此.*使用( (.*)捕获)整个URL路径。
在regex的末尾,\?*$的存在似乎意味着您期望%3F (URL编码的?)在URL路径的末尾。但是,正如所述,regex并不将这些规则排除在捕获组之外。
https://stackoverflow.com/questions/69287636
复制相似问题