Mod rewrite 使用mod_rewrite for mobile browser在URL中插入Yii模块字符串

Mod rewrite 使用mod_rewrite for mobile browser在URL中插入Yii模块字符串,mod-rewrite,apache2,yii,Mod Rewrite,Apache2,Yii,我想在检测到移动浏览器时重写URL以访问Yii模块。在Yii中,我创建了一个名为mobile的新模块。我不使用主题化(这是移动站点的常用方法),因为我打算为普通浏览器和移动浏览器用户实现完全不同的逻辑 使用http://localhost/project/mobile(或http://project/mobile正在生产中) Yii的默认.htaccess文件如下所示 RewriteEngine on RewriteBase /project/ #RewriteBase / #for produ

我想在检测到移动浏览器时重写URL以访问Yii模块。在Yii中,我创建了一个名为
mobile
的新模块。我不使用主题化(这是移动站点的常用方法),因为我打算为普通浏览器和移动浏览器用户实现完全不同的逻辑

使用
http://localhost/project/mobile
(或
http://project/mobile
正在生产中)

Yii的默认
.htaccess
文件如下所示

RewriteEngine on
RewriteBase /project/
#RewriteBase / #for production

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
问题是我想为移动浏览器访问的每个URL插入字符串
mobile
。 比如说

http://localhost/project/user -> http://localhost/project/mobile/user
http://localhost/project/login -> http://localhost/project/mobile/login
http://localhost/project/books/1 -> http://localhost/project/mobile/books/1
或用于生产

http://project/user -> http://project/mobile/user
http://project/login -> http://project/mobile/login
http://project/books/1 -> http://project/mobile/books/1
有人知道这个新的
.htaccess
是什么吗


我不介意为开发和生产服务器以及移动浏览器检测更改几个变量,我想我可以使用

中的规则。这里最简单的方法是将所有移动功能分组到“移动”模块下,并使用Yii的预路由器功能在Yii中重定向用户。这给了你更多的控制一切

class PreRouter
{ 
    public function routeRequest($oEvent)
    {
       $oApp = $oEvent->sender;
       if (<isMobile>)
          $oApp->defaultModule = 'mobile';
    }
}
在主阵列下(所以不是在模块下,这是一个应用程序设置)

如前所述,这给了你很多控制一切的能力。您可以确定用户何时被重定向(例如,iPad也是一款移动设备,但很多人希望使用常规站点)。使用此方法,您可以将他们希望保留在正常站点而不是移动站点上的cookie等存储在其中


我知道这不是你要求的重写,但我仍然希望你能找到有用的答案:)

在这里,你可以做的最简单的事情是将所有移动功能分组在一个“移动”模块下,并使用Yii的预路由器功能在Yii中重定向用户。这给了你更多的控制一切

class PreRouter
{ 
    public function routeRequest($oEvent)
    {
       $oApp = $oEvent->sender;
       if (<isMobile>)
          $oApp->defaultModule = 'mobile';
    }
}
在主阵列下(所以不是在模块下,这是一个应用程序设置)

如前所述,这给了你很多控制一切的能力。您可以确定用户何时被重定向(例如,iPad也是一款移动设备,但很多人希望使用常规站点)。使用此方法,您可以将他们希望保留在正常站点而不是移动站点上的cookie等存储在其中

我知道这不是你要求的重写,但我仍然希望你能找到有用的答案:)

试试这个

RewriteEngine On
RewriteBase /project/

# Redirect /project/*/ to /project/mobile/*/
RewriteCond %{REQUEST_URI} !^/project/mobile/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera|mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /project/mobile/$1 [L,R]

# Forward request to Yii
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
它是根据这里显示的
.htaccess
改编的

试试这个

RewriteEngine On
RewriteBase /project/

# Redirect /project/*/ to /project/mobile/*/
RewriteCond %{REQUEST_URI} !^/project/mobile/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera|mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /project/mobile/$1 [L,R]

# Forward request to Yii
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

它是根据这里显示的
.htaccess
改编的

实际上现在我更喜欢重写,因为它更简单。不过,你的回答很好。无论如何,我可以用这个方法覆盖URL规则吗?你应该可以,尽管我还没有尝试过。onBeginRequest是第一件要做的事情,甚至在WebApplication中的processRequest之前。因为它只在processRequest中进行url解析,所以应该没有问题。实际上现在我更喜欢重写,因为它更简单。不过,你的回答很好。无论如何,我可以用这个方法覆盖URL规则吗?你应该可以,尽管我还没有尝试过。onBeginRequest是第一件要做的事情,甚至在WebApplication中的processRequest之前。因为它只在processRequest中进行url解析,所以应该不会有问题。