【问题标题】:Rewrite rule for purl and querystrings重写 purl 和查询字符串的规则
【发布时间】:2012-03-08 19:45:12
【问题描述】:

这条规则有什么问题?

重写引擎开启

RewriteCond %{QUERY_STRING} !&?n=[a-z]?

RewriteCond %{HTTP_HOST} ^(?:www.)([a-z]+).myconsultinghouse.com$

重写规则 ^/$ /login.php?n=%1 [L,QSA]

重写规则 ^([a-z]+)?([^/]*)$ /$1.php?n=%1 [L,QSA] 或

重写规则 ^([az]+)?([^/])/([^/])$ /$1.php?n=%1&et=$2 [L,QSA] 或

重写规则 ^([az]+)?([^/])/([^/])/([^/]*)$ /$1.php?n=%1&et =$2&ne=$3 [L,QSA]

我想要这样:

如果用户访问该页面 - www.NameOfUser.domain.com/(NULL)

重定向 /login.php?n=NameOfUser

如果用户访问该页面 - www.NameOfUser.domain.com/page

重定向 /page.php?n=NameOfUser

如果用户访问页面 - www.NameOfUser.domain.com/page/group

重定向 /page.php?n=NameOfUser&et=group

如果用户访问页面 - www.NameOfUser.domain.com/page/group/event

重定向 /page.php?n=NameOfUser&et=group&ne=event

谁能帮帮我?

【问题讨论】:

    标签: apache .htaccess mod-rewrite redirect


    【解决方案1】:

    注意:

    • ? 不包含在查询字符串中。
    • 条件仅适用于以下规则,但不适用于后续规则。
    • 查询字符串在规则匹配中不可用
    • 由于您在规则模式中没有前导 /,我假设这是在 DOCROOT/.htaccess 文件中,在这种情况下,您应该设置一个基础并在替换目标中使用相对路径

    所以:

    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{HTTP_HOST}             ^www\.([a-z]+)\.myconsultinghouse\.com$
    RewriteRule ^                        -                                [E=USER:%1]
    
    RewriteCond %{QUERY_STRING}          \bn=[a-z]*\b                     [OR]
    RewriteCond {%ENV:USER}              =""
    RewriteRule ^                        -                                [S=4]
    
    RewriteRule ^/$                      login.php?n=%{ENV:USER}          [L,QSA]
    RewriteRule ^([a-z]+)/?$             $1.php?n=%{ENV:USER}             [L,QSA]
    RewriteRule ^([a-z]+)/(.*?)/?$       $1.php?n=%{ENV:USER}&et=$2       [L,QSA]
    RewriteRule ^([a-z]+)/(.*?)/(.*?)/?$ $1.php?n=%{ENV:USER}&et=$2&ne=$3 [L,QSA]
    

    这假定用户名是[a-z]+。如果你想允许数字和_,你也可以考虑\w+

    【讨论】:

    • 现在如果 url 中没有任何内容,我需要重定向。所以我会做我想做的:)...谢谢你的帮助!
    • 主要是的清晰度,所以选择你觉得舒服的。但请注意&?n=[a-z]+? 将匹配“n=&”和“xxn=fred”。这就是单词边界“\b”元的用途。使用“\bn=[a-z]*”并将 * 替换为 + 如果名称是强制性的。如果括号术语只是纯文本,那么静默组运算符“(?:)”也是多余的。所以www.(?:www.) 相同,但您需要www\.,因为未转义的“.”匹配任何字符。
    猜你喜欢
    • 2016-08-13
    • 2016-11-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2016-12-08
    • 2013-03-19
    相关资源
    最近更新 更多