代码之家  ›  专栏  ›  技术社区  ›  Andrik007

如何使用htaccess拆分URL

  •  0
  • Andrik007  · 技术社区  · 7 年前

    例如:

    ex.com/read?id=1
    

    应打开

    ex.com/route.php?action=read&id=1
    

    但url不会改变。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Mohammed Elhag    7 年前

    尝试以下操作:

    RewriteEngine On
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)\?id=(.+)\sHTTP.*$
    RewriteRule ^(.*)$         /route.php?action=$1&id=%2 [QSD,R=301,L,NE]
    RewriteCond %{QUERY_STRING} ^action=(.*)&id=(.*)$
    RewriteRule  ^    /%1?id=%2 [QSD,L,NE]
    

    首先,我匹配包含查询字符串的请求 id=whatever 然后用新的查询字符串重定向它。 然后匹配包含新查询字符串的新URI action=whatever&id=whatever 并在内部将其重定向到相同的原始路径。

    QSD公司 标志在Apache 2.4.0及更高版本中可用 https://httpd.apache.org/docs/trunk/rewrite/flags.html ,我添加了放弃以前的查询字符串并防止追加它。

    清除浏览器缓存,然后测试这些规则。

    更新时间: 根据您的评论,您想打开 /route.php?action=read&id=1 内部while /read?id=1 在浏览器中,您可以按照starkeen的回答进行操作,但对于特定的查询字符串和常规URI,应该如下所示:

    RewriteEngine on
    RewriteCond %{QUERY_STRING} ^id=(.*)$
    RewriteRule ^(.*)$  /route.php?action=$1 [QSA,L]
    

    因此,如果查询字符串存在,并且 id=无论什么 ,则, /abc?id=123 将从内部获取 /route.php?action=abc&id=123 之前的查询字符串将附加新的查询字符串

        2
  •  0
  •   Amit Verma    7 年前

    您可以使用以下 RewriteRule 在您的 /.htaccess :

    RewriteEngine on
    
    RewriteRule ^read/?$ /route.php?action=root [QSA,L]
    

    这将重写 /read?id=1 /route.php?action=read&id=1 。你不是读而写 &id=1 在规则的目标中,QSA会自动将其添加到重写目标中。