2010-05-10 120 views
0

我目前有一个网站,在index.php上有一个标准的网页界面,我在iphone.php中做了一个iPhone友好的版本。
两页都处理相同的参数。Apache rewrite_mod:RewriteRule路径和查询字符串

它正常工作时,我手动.../iphone.php,但我想改写上.../path/任何东西,.../path/index.phpiphone.php如果%{HTTP_USER_AGENT}包含mobile,还可以选择添加查询字符串(不知道如果/当我需要添加它)。

到目前为止,这是我在我的.../path/.htaccess

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^.+mobile.+$ [NC] 
RewriteRule index.php?(.*) iphone.php?$1 [L] 
RewriteRule index.php  iphone.php [L] 

的问题是,它匹配index.php任何子文件夹,并且它不会匹配.../path/?args ...

+0

你有一个网页的index.php或许多不同的文件夹? – 2010-05-10 14:04:46

回答

1
  1. RewriteCond适用于只有一个重写规则。
  2. 要匹配所有包含'mobile'的用户代理名称.* - 0或更多任何字符应在^.+mobile.+$语句中使用。
  3. RewriteRule默认情况下不包含查询字符串 - [QSA]标志应该用于包含查询字符串。
  4. RewriteRule使用正则表达式 - 您应该使用\.转义点。
  5. RewriteRule自动保存查询字符串相同,如果没有指定另一个。

更新:

完全.htacess

RewriteEngine On 

RewriteCond %{HTTP_USER_AGENT} ^.*mobile.*$ [NC] 
RewriteRule ^(.*)index\.php $1iphone.php [L] 

RewriteCond %{HTTP_USER_AGENT} ^.*mobile.*$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ $1iphone.php [L] 
+0

非常感谢所有这些澄清,但是这并不能解决我主要担心的问题:'.../path /?args'仍然没有处理... – 1ace 2010-05-10 14:17:31

+0

我已经添加了可能的此问题修复。你是否需要重写'.../path?args'(没有结尾的斜杠)呢? – 2010-05-10 14:26:40

+0

我确实尝试过,但是当我这样做时,Apache返回500。我的猜测是'^(。*)$'进入某种循环,并且永远不会出现。 – 1ace 2010-05-10 14:31:52

0

怎么样

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^.*mobile.*$ [NC] 
RewriteRule /path/index.php /path/iphone.php [QSA,L] 

编辑:QSA是Query string append,所以你不需要处理不同ently。如果你愿意,你可以添加一个额外的参数太多,如:

RewriteRule /path/index.php /path/iphone.php?extra=param [QSA,L]