gpt4 book ai didi

apache - 如何修改包含路径和参数的查询字符串?

转载 作者:行者123 更新时间:2023-12-04 16:32:24 26 4
gpt4 key购买 nike

我的网站使用了一个相当复杂的查询字符串参数:它的值是一个包含参数的路径。
对于 SEO(搜索引擎优化)等。我现在正在尝试 mod_rewrite 缩短版本...

  • example.com/path/c1/d1/e1.html?x=x1&y=y1
  • example.com/path/c2/d2/e2.html?x=x2&y=y2
  • example.com/path/c2/d3/e4.html?x=x5&y=y6

  • ...到当前所需...
  • example.com/path/?param=a/b/c1/d1/e1?x=x1&y=y1
  • example.com/path/?param=a/b/c2/d2/e2?x=x2&y=y2
  • example.com/path/?param=a/b/c2/d3/e4?x=x5&y=y6

  • 所以目标是...
  • 去掉固定部分( ?param=a/b/ )以缩短地址和
    没有两个?在可见地址
  • 保留查询字符串值的必要变量路径组件(如 c1/d1/e1c2/d2/e2c2/d3/e4)
  • 添加 .html到查询字符串值 ? 之前的最后一部分使文件夹结构看起来少 1 级
  • 保留查询字符串值的必要变量参数(如 ?x=x1&y=y1?x=x2&y=y2?x=x5&y=y6 )

  • 经过数小时的研究并尝试了许多不起作用的事情,我在这里注册以征求您对如何解决这个烂摊子的建议。你能帮帮忙吗?
    编辑/附加信息:
  • 固定字符串后/path/?param=a/b/它总是 3 个可变路径段,如 c1/d1/e1 .
  • 这些变量段可以包含字母数字字符 a-z A-Z 0-9 , 破折号 -和括号符号 () .
  • 这同样适用于参数值 (x1, y1)。此外,y1 可以包含百分比符号 %由于 URL 编码。
  • 使用两个问号(一个作为查询字符串的开始,另一个作为参数值的一部分)看起来无效但有效。
  • 处理请求的实际文件是 /path/index.php .
  • 最佳答案

    在您的 .htaccess 顶部尝试以下操作文件,使用 mod_rewrite:

    RewriteEngine on

    # REDIRECT: /path/?param=a/b/c1/d1/e1?x=1&y=y1
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\s/path/(?:index\.php)?\?param=a/b/([^/]+/[^/]+/[^/]+)\?(x=[^&]+&y=[^&]+)\s
    RewriteRule ^(path)/(?:index\.php)?$ /$1/%1.html?%2 [R=302,L]

    # REWRITE: /path/c1/d1/e1.html?x=x1&y=y1
    RewriteCond %{QUERY_STRING} ^(x=[^&]+&y=[^&]+)$
    RewriteRule ^(path)/([^/]+/[^/]+/[^/]+)\.html$ $1/index.php?param=a/b/$2?%1 [L]
    第一条规则重定向 对表单 /path/?param=a/b/c1/d1/e1?x=1&y=y1 的“旧”URL 的任何直接请求( index.php 是可选的)到形式 /path/c1/d1/e1.html?x=x1&y=y1 的"new"规范 URL .这是为了搜索引擎和任何无法更新的第三方入站链接的利益。但是,您必须已经将所有内部链接更改为"new"规范 URL。
    通过匹配 THE_REQUEST (与 QUERY_STRING 相反)我们通过防止重写的 URL 被重定向来避免重定向循环。 THE_REQUEST包含请求头的第一行,不会被其他重写改变。例如, THE_REQUEST将包含以下形式的字符串:
    GET /path/?param=a/b/c1/d1/e1?x=1&y=y1 HTTP/1.1
    这是当前的 302(临时)重定向。仅在您测试此操作正常后才将其更改为 301(永久)重定向,以避免潜在的缓存问题。
    第二条规则在内部重写 对"new"规范 URL 的请求,例如。 /path/c1/d1/e1.html?x=x1&y=y1 ,回到原始/底层 URL 路径,例如。 /path/index.php?param=a/b/c1/d1/e1?x=1&y=y1 . &在最后一个 URL 参数被有意非转义(即 URL 解码)之前,如评论中所述。 $1$2反向引用指回 RewriteRule 中捕获的组图案。而 %1%2 backreferencs 指的是前面 CondPattern 中捕获的组。

    These variable segments can contain alphanumerical characters a-z A-Z 0-9, dash symbol - and bracket symbols ( and ).


    我在上面的正则表达式中使用了更通用(和更短)的子模式,它将匹配更多字符,但可以说更容易阅读。 IE。 [^/]+ - 匹配除斜杠和 [^&]+ 以外的任何内容- 匹配除 & 之外的任何内容.
    如果您特别想只匹配允许的字符,那么您可以将上述子模式更改为 [a-zA-Z0-9()%-]+[\w()%-]+这也匹配下划线( _ )。

    UPDATE: x and y are just examples for parameter names, but in reality there can be lots of different parameter names.
    the parameters have more than a single character. They consist of letters a-z, A-Z and in the future maybe digits 0-9. There can be more than the two parameters x and y.


    也许只匹配任何查询字符串(前提是有一个查询字符串)。
    请尝试以下操作:
    # REDIRECT: /path/?param=a/b/c1/d1/e1?x=1&y=y1
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\s/path/(?:index\.php)?\?param=a/b/([^/]+/[^/]+/[^/]+)\?([^\s]+)
    RewriteRule ^(path)/(?:index\.php)?$ /$1/%1.html?%2 [R=302,L]

    # REWRITE: /path/c1/d1/e1.html?x=x1&y=y1
    RewriteCond %{QUERY_STRING} ^(.+)$
    RewriteRule ^(path)/([^/]+/[^/]+/[^/]+)\.html$ $1/index.php?param=a/b/$2?%1

    关于apache - 如何修改包含路径和参数的查询字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64466207/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com