0

我在子域中建立了一个移动网站。我已经成功地从以下位置实现了重定向 302:

www.domain.com to m.domain.com in htaccess.

我现在想要实现的是将用户重定向到:

www.domain.com/internal-page/ > 302 > m.domain.com/internal-page.html

请注意,桌面和移动设备的 URL 名称不同。我正在使用的代码如下所示:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

# Mobile Redirect
# Verify Desktop Version Parameter
RewriteCond %{QUERY_STRING} (^|&)ViewFullSite=true(&|$)

# Set cookie and expiration
RewriteRule ^ - [CO=mredir:0:www.domain.com:60]

# Prevent looping
RewriteCond %{HTTP_HOST} !^m.domain.com$

# Define Mobile agents
RewriteCond %{HTTP_ACCEPT} "text\/vnd\.wap\.wml|application\/vnd\.wap\.xhtml\+xml" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "sony|symbian|nokia|samsung|mobile|windows ce|epoc|opera" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "mini|nitro|j2me|midp-|cldc-|netfront|mot|up\.browser|up\.link|audiovox"[NC,OR]
RewriteCond %{HTTP_USER_AGENT} "blackberry|ericsson,|panasonic|philips|sanyo|sharp|sie-"[NC,OR]
RewriteCond %{HTTP_USER_AGENT} "portalmmm|blazer|avantgo|danger|palm|series60|palmsource|pocketpc"[NC,OR]
RewriteCond %{HTTP_USER_AGENT} "smartphone|rover|ipaq|au-mic,|alcatel|ericy|vodafone\/|wap1\.|wap2\.|iPhone|android"[NC]

# Verify if not already in Mobile site
RewriteCond %{HTTP_HOST} !^m\.

# We need to read and write at the same time to set cookie
RewriteCond %{QUERY_STRING} !(^|&)ViewFullSite=true(&|$) 

# Verify that we previously haven't set the cookie
RewriteCond %{HTTP_COOKIE} !^.*mredir=0.*$ [NC]

# Now redirect the users to the Mobile Homepage
RewriteRule ^$ http://m.domain.com [R]
RewriteRule $/internal-page/ http://m.domain.com/internal-page.html [R,L]
4

1 回答 1

0

最后,您有两RewriteRule行我认为应该更改为:

RewriteRule ^\/?$ http://m.domain.com [R=302]
RewriteRule ^\/?(.*)\/?$ http://m.domain.com/$1.html [R=302,L]

^\/?(.*)\/?$方法给我一个从开头(^)开始的字符串,并给我所有字符((.*))直到结尾($ ),如果有一个(? )没有尾随/开头(/)。

http://m.domain.com/$1.html意味着如果地址是,http://www.domain.com/internal-page/那么它就变成了http://m.domain.com/internal-page.html

[R=302,L]应该意味着 302 重定向(R=302)和最后一次重写(L),因此我们的 URL 上不会发生其他重写。

编辑:

我相信在您的RewriteRules的情况下,如果 URL 只是域,则第一个重定向到http://m.domain.com,但是如果还有其他任何内容,那么第二次重写失败,因为它实际上不是字面意思/internal-page/,您需要一个正则表达式变量放入新的 URL。

编辑(2):

要从特定桌面页面重定向到每个移动页面:

RewriteRule ^\/foo\/?$ http://m.domain.com/bar.html [R=302]
RewriteRule ^\/hello\/?$ http://m.domain.com/world.html [R=302]

( /? ) 表示/在该位置是可选的,并且 ( ^ ) 表示开始, ( $ ) 在这种情况下表示结束(^也可以用来表示类似[^\.]的东西,除了句点之外的任何东西)。

只需将您需要的多少个连续进行重定向,这应该可以解决问题。为了确保没有误解,第一行将意味着http://www.domain.com/foo/它将成为http://m.domain.com/bar.html,并且因为尾部斜杠是可选http://www.domain.com/foo的(注意尾部正斜杠不存在)也将重定向到http://m.domain.com/bar.html.

您可以稍微调整一下语法来自定义它,但希望我已经为您指明了正确的方向。如果您还需要什么,请告诉我,我会尽力提供帮助。

我不想听起来像是一张破唱片或任何东西,但我觉得我不能,凭着良心,在不指出修改移动网站会是更好的方法的情况下结束这次编辑。如果不可能,或者你觉得一些静态重定向与修改一些页面相比没什么大不了的,那么我完全理解,但这里有一些事情需要你考虑:

如果移动站点和桌面站点位于不同的文件夹中,则可以使用完全相同的名称方案来使重写更简单,这意味着随着新页面/内容的添加,您将不需要更多的重写语句(进行更多的重写意味着您有创建新页面,然后您必须创建重定向。这是额外的工作和需要您注意的更多文件。)

如果移动站点实际上是从与桌面站点相同的目录托管的,则更改其中一个或另一个的文件,使其变为类似/desktop-foo//d-foo/然后很容易使重写(重定向)转到类似/m-foo.html. 您可以放弃修改桌面页面,并让您/foo//m-foo.html所有移动版本都以“m”开头。

想到的第三个选项是最困难和最耗时的,具体取决于站点的内容,但它是一个非常酷的选项,最终会使站点最容易工作(当然是在初始工作之后) . 在不使用 mod_rewrite 或单独页面的情况下,很有可能将同一页面用于桌面、移动设备、平板电脑等。CSS 中的媒体查询之类的内容将允许您根据客户端查看页面的内容来更改页面的外观。我之前遇到过一个关于这个主题的教程,它使用媒体查询和屏幕的最大宽度来确定页面的外观。这现在需要做大量的工作,但如果您能够应对挑战,可以节省一些麻烦,并且可以成为有趣的学习体验。

再一次,很抱歉这在最后偏离了话题,但我从你最初的问题和你的回答中得到了印象,如果你还没有考虑过并驳回它们,你可能会发现替代品很有趣,即使替代品没有你感兴趣的是你不会像某些人那样回应,“嘿,$ *%&你,伙计!我要求重写而不是所有其他垃圾!” 我希望你把它当作它的目的是......有帮助。

于 2013-06-25T16:48:05.007 回答