【问题标题】:.htaccess how to serve contents from different directory for mobile and desktop?.htaccess 如何为移动和桌面提供不同目录中的内容?
【发布时间】:2021-11-06 09:31:15
【问题描述】:

我的网站有两个版本。一个是移动版,另一个是桌面版。

路径如下所示:

手机版:public_htm/mobile

桌面版:public_html

我想根据设备更改我的域的文档根目录。如果用户的设备是移动设备,我想提供来自 mobile 文件夹的内容,如果用户在桌面上,我想提供来自 public_html 的内容。

如何使用.htaccess 做到这一点?

我希望我的域在桌面和移动设备上都相同,只是文档根目录由 .htaccess 根据设备更改。

【问题讨论】:

  • “基于设备”是什么意思?您是否有针对不同设备的不同 URL(例如 m. 子域),或者您是否希望根据设备的用户代理字符串来识别设备?
  • 您将在 SO 上找到数百个类似问题的现有答案。我建议你检查一下。
  • 是的,基于用户代理,我不需要 m.example.com,我只需要相同的域。
  • 您所说的“网络”,实际上是指“桌面”(“移动”的反义词)。
  • 是的,与移动相反。

标签: apache .htaccess mod-rewrite


【解决方案1】:

您需要在根 .htaccess 文件的顶部添加如下内容:

RewriteEngine On

# Prevent direct access to the "/mobile" subdirectory
# - redirect back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^mobile/(.*) /$1 [R=301,L] 

# Rewrite all requests from mobile devices to the "/mobile" site
RewriteCond %{HTTP_USER_AGENT} ^iphone|android|etc$ [NC]
RewriteRule ^(?!mobile/).* mobile/$0 [L]

移动检测正则表达式(RewriteCond 指令)只是一个示例,具体细节留给读者。 (供参考:mobile browser user-agent strings)

RewriteRule pattern 中的negative lookahead 防止已经重写到/mobile 子目录的请求被重复重写。如果您在包含 mod-rewrite 指令的 /mobile 子目录中有另一个 .htaccess,那么这可能是不必要的。

第一条规则将任何直接到/mobile 子目录的流量重定向回文档根目录。但是,如果您在包含 mod-rewrite 指令的 /mobile 子目录中有另一个 .htaccess 文件,则需要将此重定向移动到该 .htaccess 文件(此处不起作用)。


只是关于术语的注释......这并没有严格改变“文档根”,如问题中所述。 (尽管它可能“看起来像”它从客户端的角度来看。)这在内部将请求重写到子目录(URL 重写)。在/mobile 子目录中运行的服务器端应用程序仍将文档根视为父目录。您无法更改.htaccess 中的“文档根目录”,这只能通过在服务器配置中设置DocumentRoot(或VirtualDocumentRoot)指令来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2020-10-03
    • 2017-09-25
    相关资源
    最近更新 更多