在移动设备上找不到网页 - 404

Webpage not found on mobile devices - 404

我正要建立一个网站,现在已经上传到服务器了。

虽然在桌面设备上显示页面没有问题,但在移动设备上会出现 404 错误。 如果我在移动设备上以桌面视图打开该页面,则会显示该页面。

diemoebelbewegung.de

该站点未使用 wordpress 或类似的 CMS。 我目前没有使用 .htaccess 文件,这会是个问题吗?

我是服务器设置的初学者,刚刚上传了所有文件。 该网站应该完全响应。


编辑:

发现必须将移动设备重定向到子文件夹 /m。

所以现在我只是为这个子文件夹 m 中的所有文件制作了第二个副本。 这暂时解决了我的问题,但不是长期的。

知道将移动设备重定向到子文件夹 m 的来源吗?或者如何避免在网络服务器上存储文件两次。

编辑

这可能是某些服务器端默认重定向吗?是否有一种方法可以用 .htaccess 规则覆盖它?

另一个想法是仅将桌面设备重定向到子文件夹 /m

编辑

@MrWhite 的回答暂时解决了问题:

RewriteEngine on

# Required for the canonical redirect, if the trailing slash is omitted.
RewriteBase /

# Redirect any "direct" requests for the /m subdirectory back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^m(/.*|$)  [R=301,L]

# Rewrite all requests to the /m subdirectory (if not already)
RewriteRule !^m/ m%{REQUEST_URI} [L]

仍然不清楚为什么 'redirection' 到 /m 会发生。

One way would be to redirect only desktop devices to the /m directory and have all the content stored in /m. Is there a way to do so via .htaccess?

理论上,这应该可以作为一种“解决方法”。但是,找到此“重定向”(或更确切地说“内部重写”)发生的位置并修复它是首选方法。

如前所述,这似乎确实是对 /m 子目录的 内部重写 ,而不是严格意义上的“重定向”(这意味着 外部 3xx HTTP 重定向)。 URL 没有变化。这可能是基于 User-Agent 字符串的条件。

无论如何,要在 .htaccess 中针对 所有 请求(即桌面也是如此)实施此操作,然后您可以使用 mod_rewrite 执行类似以下操作在根 .htaccess 文件中:

RewriteEngine on

# Rewrite all requests to the /m subdirectory (if not already)
RewriteRule !^m/ m%{REQUEST_URI} [L]

这会将所有请求重写到 /m 子目录,因此您只需维护一个代码库,即。 /m 子目录中的那个。

我们还可以“纠正”对 /m 子目录的任何直接请求并重定向回根目录,从而防止搜索引擎出现潜在的 重复内容 问题。以下指令需要在 之前 上面的重写(在 RewriteEngine 指令之后)。

# Required for the canonical redirect, if the trailing slash is omitted.
RewriteBase /

# Redirect any "direct" requests for the /m subdirectory back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^m(/.*|$)  [R=301,L]

检查 REDIRECT_STATUS 环境变量的 条件 确保我们只针对客户端的直接请求,而不是重写请求。

substitution 中的 </code> 反向引用包含 URL-path 减去 <code>m/ 前缀(即子目录)。在请求 /m 时没有尾部斜杠的情况下,替换字符串否则为空 - 因此需要 RewriteBase 指令来避免格式​​错误的重定向。 (或者,可以将 RewriteRule 指令修改为 RewriteRule ^test(?:/(.*)|$) / [R=302,L] 以避免需要 RewriteBase)。

重要提示:首先使用 302(临时)重定向进行测试以避免潜在的缓存问题。

测试前清除浏览器缓存。

总结

所有指令 in-place。

RewriteEngine on

# Required for the canonical redirect, if the trailing slash is omitted.
RewriteBase /

# Redirect any "direct" requests for the /m subdirectory back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^m(/.*|$)  [R=301,L]

# Rewrite all requests to the /m subdirectory (if not already)
RewriteRule !^m/ m%{REQUEST_URI} [L]

旁白: 我注意到您目前没有对 www 子域进行规范化? IE。 www 与 non-www.


更新: 尝试使用上述规范重定向的替代方法:

# Redirect any "direct" requests for the /m subdirectory back to the root
RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\s/m(/|$)
RewriteRule ^m(/.*|$)  [R=301,L]

THE_REQUEST 服务器变量包含从客户端发送的请求 headers 的第一行。并且在 重写 请求时不应更改。但是,如果请求被代理 那么这可能也不会起作用。