gpt4 book ai didi

apache - 重写动态 URL

转载 作者:行者123 更新时间:2023-12-04 12:36:13 25 4
gpt4 key购买 nike

我试图将 1 个动态 URL 重写为另一个动态 URL,如下所示;

/category?category=News to
/categorysearch/result/?q=news

我想知道是否有人知道如何在 htaccess 中做到这一点?

谢谢。

最佳答案

所以最后已编辑 解决方案是(对于您链接的 .htaccess):

RewriteCond %{REQUEST_FILENAME} ethical [NC]
RewriteCond %{QUERY_STRING} (^|&|%26|%20)ethical(=|%3D)([^&]+) [NC]
RewriteRule .* /catalogsearch/result/?q=%3 [L,R]

如果我在当前问题中使用“类别”术语:
RewriteCond %{REQUEST_FILENAME} category [NC]
RewriteCond %{QUERY_STRING} (^|&|%26|%20)category(=|%3D)([^&]+) [NC]
RewriteRule .* /categorysearch/result/?q=%3 [L,R]

但第一个更清楚,类别一词并非处处都使用。如果你想添加小写转换,我们甚至会这样做:
# outside of a Directory section
RewriteMap lowercase int:tolower
# in a Directory section (not a .htaccess)
RewriteCond %{REQUEST_FILENAME} category [NC]
RewriteCond %{QUERY_STRING} (^|&|%26|%20)category(=|%3D)([^&]+) [NC]
RewriteRule .* /catalogsearch/result/?q=${lowercase:%3} [L,R]

但正如评论 最后一个 tolower 无法在 .htaccess 中工作 ——无论如何 .htaccess 是不好的,真的,对于性能,你真的应该考虑设置 AllowOverride None 并将所有这些东西移动到 VirtualHost 中。以及诸如 之类的好东西重写 map 无法处理 .htaccess 文件。

所以现在我会 解释规则。首先,您遇到的主要问题是 之后的所有内容。 “?” 查询字符串 ,而不是 请求的文件名 .大多数 rewriteRules 尝试处理请求的文件名。所以我首先检查我们是否在目标文件名上:
RewriteCond %{REQUEST_FILENAME} category [NC]

然后我们将处理查询字符串(问号之后的所有内容)。我们本可以写得更简单一些:
RewriteCond %{REQUEST_FILENAME} category [NC]
RewriteCond %{QUERY_STRING} ^category=(.+) [NC]
RewriteRule .* /catalogsearch/result/?q=${lowercase:%1} [L,R]

在可用于 RewriteRule 的变量 %1 中捕获 ?category= 之后的所有内容。但是 QUERY_STRING 参数有几个问题,让我们试着用它来找点乐子:
  • url 解码尚未在此参数上完成
  • category 可能不是参数列表中的第一个参数
  • 它甚至可能不是最后一个 (&foo=bar)
  • 您可以在
  • 之前留一些空格

    已编辑 :

    我的第一个回答是:
    RewriteCond %{REQUEST_FILENAME} category [NC]
    RewriteCond %{QUERY_STRING} [^|&|%26|%20][category](=|%3D)([^&]+) [NC]
    RewriteRule .* /catalogsearch/result/?q=${lowercase:%2} [L,R]

    [^|&|%26|%20]捕捉到它可能是起始参数或 & 或空格后的参数的事实, %26是一个 & urlencoded。

    但这是 错误 ,感谢@mootinator 评论,我检查了更多,[category] ​​匹配 'category' 但也匹配 'atcatcategory' 和这些字母的任意组合。
    RewriteCond %{QUERY_STRING} category(=|%3D)([^&]+) [NC]

    匹配 'category' 参数,删除 ^允许将此参数放置在任何地方。但这也将匹配名为 subcategory 的参数.所以第一个字母必须是空格或 & (或查询字符串的开头)。

    这就是 [^|&|%26|%20] 的原因, 对我来说意味着链的开始或 & 或空格或 & 在 urlencoded 中。但这也是 , ^[]表示否定。所以我们需要在这里使用匹配括号: (^|&|%26|%20) ,现在它可以工作了,唯一的问题是参数的值现在是 %3 而不是 %2

    然后我们捕获(类别)单词,准确地说,我们实际上应该逐个字母地捕获它,其中包含大写、小写和 urlencoded 版本的小写和大写字母,就像一个可怕的 [c|C|%43|%63][a|A|%61|%41][t|T|%74|...]to be continued -- 我也许应该使用括号而不是括号,见鬼,检查 urlencoded characters list here .
    (=|%3D) '=' 字符是否经过 urlencoded。我本来可以用 [=|%3D]%3D在这种情况下不匹配,我不明白为什么(mod_rewrite 是一个奇怪的地方)。由于使用了第一个匹配括号,我们将不得不使用 %2 变量而不是 %1。

    然后我们有很好的 ([^&]+)这意味着任何东西,但不是“&”。

    在这些条件之后,我们应用 RewriteRule。我们获取所有内容(这是 .* )并将其重定向到 /catalogsearch/result/?q=%2我们在哪里使用 %3而不是 $1$3因为我们没有在 rewriteRule 上捕获任何内容,而是在之前的条件下( %3 是最后一个条件下捕获的第三个数据,所以它是 ([^&]+) )。
    如果添加 QSA 标志 ([L,R,QSA]) 在 rewriteRule 中,您甚至会在最终查询字符串中取回其他参数,以便:
    ethical?bar=toto& ethical=Foo&zorglub=titi 
    => is redirected to
    catalogsearch/result/?q=foo&bar=toto&%2520ethical=Foo&zorglub=titi

    如果我玩一点 url 编码:
    ethical?bar=toto%26 ethical%3DFoo&zorglub=titi 
    => is redirected to
    catalogsearch/result/?q=foo&bar=toto%2526%2520ethical%253DFoo&zorglub=titi

    但这不是游戏的结束,我会让你处理所有你可能想要检测 Foo 值的所有变化并将它们与tolower混合的urlencoding问题(这里它坏了)。您甚至可能不会在参数或额外属性中遇到编码 url 的这些问题,但这很有趣 :-)

    关于apache - 重写动态 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7703552/

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