2011-03-31 50 views
0

我很難解釋這一點。請讓我知道任何具體的信息,可以讓我的問題更清楚。基於Cookie的移動網站URL重寫

如何才能更好地分離桌面和移動用戶的兩條「流程」條件&規則。

該網站有兩個版本全&手機。 「完整」網站由index.php提供,依靠jQuery交換內容(頁面爲&的子頁面)。 「完整」網站爲Facebook和瀏覽器提供了一個替代的靜態頁面視圖。

該移動網站是基於整個網站的內容,但內容範圍更加有限。

在桌面瀏覽器(或當一個cookie指定)的URL應提供:

(1) http://domain.com/#/resources/article --> http://domain.com/index.php#/resources/article 
(2) http://domain.com/resources/article --> http://domain.com/static.php?page=resources&subpage=article 

在移動瀏覽器(或當一個cookie指定)相同的URL應提供:

(3) http://domain.com/resources/article --> http://domain.com/m/resources/article 

我沒有能夠獲得靜態重寫(2)工作,沒有打破移動重寫(3)。在.htaccess中使用

我重寫:

RewriteEngine On 
RewriteBase/

# Try to avoid loops 
RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 

# 
# Check for mobile browsers 
# 
RewriteCond %{HTTP_COOKIE} !^.*mobile.*$ [NC] 
RewriteCond %{HTTP_USER_AGENT} android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mmp|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ (ce|phone)|xda|xiino [NC,OR] 
RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r\ |s\)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|\)|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-) [NC] 
RewriteRule .* - [CO=mobile:true] 

# 
# If we want the full/desktop site 
# 
RewriteCond %{HTTP_COOKIE} ^.*mobile=false.*$ [NC,OR] 
RewriteCond %{HTTP_COOKIE} !^.*mobile.*$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/\.]+)/([^/\.]+)?$ /static.php?page=$1&subpage=$2 [NC,L] 
RewriteRule .* - [NC,L] 

# 
# If we want the mobile site 
# 
# Some misc redirects to better align with urls of full/desktop site 
RewriteCond %{HTTP_COOKIE} ^.*mobile=true.*$ [NC] 
RewriteRule ^our-services/?$ /services [R,NC,L] 
RewriteRule ^.+financial-planning/?$ /financial-planning [R,NC,L] 
RewriteRule ^.*spotlight-1/?$ /john-doe [R,NC,L] 

RewriteCond %{HTTP_COOKIE} ^.*mobile=true.*$ [NC] 
RewriteRule (.*) m/$1 [NC,QSA] 

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule .* - [NC,L,QSA] 

RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_FILENAME}/index.php -s 
RewriteRule .* - [NC,L,QSA] 

RewriteRule (.*) $1.php [NC,L,QSA] 

感謝您的輸入。

回答

0

上述代碼有兩個基本問題:(1)無條件運行的RewriteRules;(2)RewriteRules的co =標誌失敗。

以下代碼有效,但不可能是最簡潔的解決方案。

我確實最終改變了我的路由策略,從直接重寫所有移動URL到使用php文件進行路由。這不會改變重寫的核心功能,下面的代碼仍然與原始問題有關。

爲了有多個的RewriteRules執行基於該相同的RewriteCond既可以使用的鏈標誌,看http://httpd.apache.org/docs/current/rewrite/flags.html#flag_c,或將複製的RewriteCond爲每個所需重寫規則。

根據我的經驗,使用RewriteRule來設置cookie可能非常挑剔。雖然Mod_Rewrite RewriteRule文檔http://httpd.apache.org/docs/current/rewrite/flags.html#flag_co表示唯一所需的參數是名稱和值,但我必須設置所有參數才能取得成功。這可能是特定於我的Apache配置的東西,但目前我無法確定。

另外,RewriteRule C標誌似乎只在您嘗試修改url時才起作用。 例如

# No substitution is attempted. The following rule fails. 
RewriteRule .* - [co=mobile:true:.domain.com:7200:/,NC] 

# A useless substitution is made. The following rule works 
RewriteRule (.*) $1 [co=mobile:true:.domain.com:7200:/,NC] 

我的最終代碼。

RewriteEngine On 
RewriteBase/

#RewriteCond %{ENV:REDIRECT_STATUS} 200 
#RewriteRule .* - [L] 


# 
# Check for mobile browsers 
# 
RewriteCond %{HTTP_COOKIE} !^.*mobile.*$ [NC] 
RewriteCond %{HTTP_USER_AGENT} android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mmp|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ (ce|phone)|xda|xiino [NC,OR] 
RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r\ |s\)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|\)|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-) [NC] 
#RewriteRule (.*) $1 [co=mobile:true] 
#Header set Set-Cookie "mobile=true; path=/;" 
RewriteRule (.*) $1 [co=mobile:true:.domain.com:7200:/,NC,C] 
RewriteRule ^index.php$ m.php [NC,L] 

RewriteCond %{HTTP_COOKIE} !^.*mobile.*$ [NC] 
RewriteCond %{HTTP_USER_AGENT} android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mmp|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ (ce|phone)|xda|xiino [NC,OR] 
RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r\ |s\)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|\)|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-) [NC] 
#RewriteRule (.*) $1 [co=mobile:true] 
#Header set Set-Cookie "mobile=true; path=/;" 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*) $1 [co=mobile:true:.domain.com:7200:/,NC,C] 
RewriteRule ^([^/\.]+)?(/)?([^/\.]+)?$ /m.php?page=$1 [NC,L] 


# 
# If we want the full/desktop site 
# 
RewriteCond %{HTTP_COOKIE} ^.*mobile=false.*$ [NC,OR] 
RewriteCond %{HTTP_COOKIE} !^.*mobile.*$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/\.]+)?(/)?([^/\.]+)?$ /static.php?page=$1&subpage=$3 [NC,L] 


# 
# If we want the mobile site 
# 
RewriteCond %{HTTP_COOKIE} ^.*mobile=true.*$ [NC] 
RewriteRule ^index.php$ m.php [NC,L] 

RewriteCond %{HTTP_COOKIE} ^.*mobile=true.*$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/\.]+)?(/)?([^/\.]+)?$ /m.php?page=$1 [NC,L]