A.htaccess在编辑查询字符串时重定向

A.htaccess在编辑查询字符串时重定向,.htaccess,redirect,mod-rewrite,url-redirection,.htaccess,Redirect,Mod Rewrite,Url Redirection,我试图重定向到一个新的域,同时保留查询字符串,但以修改的方式 例如,我想重定向: http://guides.freshstoreinstant.com/fresh-store-instant/how-to-find-your-amazon-affiliate-key-secret-key 到 因此,我想: 从原始URL中获取最后一个“文件夹”(如何查找您的amazon附属密钥密钥) 将-替换为+ 将结果附加到https://guides.freshlabs.group/search?quer

我试图重定向到一个新的域,同时保留查询字符串,但以修改的方式

例如,我想重定向:

http://guides.freshstoreinstant.com/fresh-store-instant/how-to-find-your-amazon-affiliate-key-secret-key

因此,我想:

  • 从原始URL中获取最后一个“文件夹”(
    如何查找您的amazon附属密钥密钥

  • -
    替换为
    +

  • 将结果附加到
    https://guides.freshlabs.group/search?query=
    并使用301重定向

  • 我尝试了一些事情,对
    .htaccess
    略知一二,但这一点让我感到困惑

    更新


    结合使用
    .htaccess
    和PHP,这可能会更容易。我可以使用
    .htaccess
    将所有URL重写为
    index.php
    ,然后使用php替换字符并重定向吗?

    使用apache的重写模块是不可能的,因为它不支持此类搜索和替换操作。它只是重写。如果您确实无法使用未更改的字符串,而您可能仍然可以在处理逻辑中拆分该字符串,那么您可以选择以下选项:

    或者引入另一个重写层,基于一些脚本引擎,该脚本引擎接受未更改的字符串,通过正常的字符串操作和输出重定向头来转换它

    或者你可以用apache的替代模块做一些事情,但是你需要安装和加载它,而且它的使用并不容易(这么做了,抱怨了很多…)

    或者使用外观奇特但有效的解决方法:

    RewriteEngine on
    
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5+$6+$7+$8+$9 [R=301,QSA]
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5+$6+$7+$8 [R=301,QSA]
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5+$6+$7 [R=301,QSA]
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5+$6 [R=301,QSA]
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5 [R=301,QSA]
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4 [R=301,QSA]
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3 [R=301,QSA]
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2 [R=301,QSA]
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteRule ^/?fresh-store-instant/([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1 [R=301,QSA]
    
    此规则集在http服务器主机配置或动态配置文件(“.htaccess”样式文件)中也会起同样的作用


    更新:

    我意识到要转换的示例字符串包含9个以上的令牌,这或多或少是apache http服务器支持的反向引用的硬编码限制。如果可以重新编译源代码,您可以改变这一点,在这种情况下,上述解决方案很好,可以扩展到您认为安全的大量令牌

    如果这不是一个选项(通常情况下),您需要尝试以下方法:

    RewriteEngine on
    
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteCond %{QUERY_STRING} (^|&)query=(.+)&|$
    RewriteRule ^/?fresh-store-instant/?$ https://guides.freshlabs.group/search [R=301,QSA]
    
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteCond %{QUERY_STRING} (^|&)query=(.+)(&|$)
    RewriteRule ^/?fresh-store-instant/([^/-]*)[-]?(.*)/?$ /fresh-store-instant/$2?query=%2+$1 [N,QSD]
    
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteCond %{QUERY_STRING} !(^|&)query=
    RewriteRule ^/?fresh-store-instant/([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1 [R=301,QSD]
    
    RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
    RewriteCond %{QUERY_STRING} !(^|&)query=
    RewriteRule ^/?fresh-store-instant/([^/-]*)[-](.*)/?$ /fresh-store-instant/$2?query=$1 [N,QSD]
    
    注意:我没有测试这个,只是写了下来,所以可能有一些小故障。不过,这应该行得通。它实现了一种多重重写策略:它在单独的go中重写每个标记,并将该标记“存储”在一个初步查询参数中。一个接一个地组装令牌,直到执行最终的外部重定向,因为请求中没有更多要转换的令牌



    还有一个一般性的注释:您应该总是更喜欢将这些规则放在http服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,而且它们确实降低了http服务器的速度。只有在您无法访问真正的http服务器主机配置(读:真正廉价的服务提供商)或坚持编写自己的规则的应用程序(这显然是一个安全噩梦)的情况下,才提供它们作为最后一个选项

    您可以使用
    .htaccess
    中的mod_rewrite来完成此操作。在
    .htaccess
    文件顶部尝试以下操作:

    RewriteEngine On
    
    RewriteRule ^(fresh-store-instant)/([^/]*)-([^/]*)$ $1/$2+$3 [N]
    RewriteRule ^fresh-store-instant/([^/]+)$ https://guides.freshlabs.group/search?query=$1 [R=302,L]
    
  • 第一条规则重复重写请求(内部),将第二个路径段中的所有
    -
    (连字符)替换为
    +
    N
    next
    )标志显式触发重写循环。这应该谨慎使用;与任何类似递归的行为一样,它需要在某个点失败。(注意:URL路径中的
    +
    只是一个文本
    +

  • 替换所有连字符后,第二条规则将触发到其他域的外部重定向,将第二个路径段(现在包含
    +
    )复制到目标URL中的查询字符串。(注意:URL的查询字符串部分中的
    +
    被接收服务器视为编码空间。)

  • 请注意,这是一个临时(302)重定向。只有在您确认301(永久)可以正常工作后才可以更改它-以避免缓存问题

    测试前清除浏览器缓存

    …同时保留查询字符串,但以修改的方式

    示例源URL上没有要“保留”的查询字符串?请注意,上述重定向将覆盖源URL上可能存在的任何查询字符串。如果要“附加”请求中的查询字符串,请在第二个
    重写规则
    中包含
    QSA


    更新:

    第一个“文件夹”可以不同(例如
    http://guides.freshstoreinstant.com/fresh-store-builder/...

    如果文件夹的子集有限,那么最好明确命名每个文件夹,以避免与站点上的其他URL发生潜在冲突。例如:

    RewriteRule ^(fresh-store-(?:instant|builder))/([^/]*)-([^/]*)$ $1/$2+$3 [N]
    RewriteRule ^fresh-store-(?:instant|builder)/([^/]+)$ https://guides.freshlabs.group/search?query=$1 [R=302,L]
    
    如果将初始目录设置为完全可变(如下所示),那么我可以想象这与现有URL冲突:

    RewriteRule ^([\w-]+)/([^/]*)-([^/]*)$ $1/$2+$3 [N]
    RewriteRule ^([\w-]+)/([^/]+)$ https://guides.freshlabs.group/search?query=$1 [R=302,L]
    

    很抱歉,在我第一次尝试时出现了问题,我在答案中添加了一个更新,其中考虑到了这一点。希望这能给你指明正确的方向。谢谢你,阿卡夏,我试过了,但没用。。我不喜欢添加apache的替代模块,就像你说的,这似乎很难!.htaccess和PHP的组合会起作用吗?类似于:1)使用.htaccess将所有URL请求重写为index.php 2)在php中提取查询字符串,替换字符3)使用PHPSure重定向到新URL,这是我指出的第一个选项,当然很容易实现。不过它也很慢。你介意解释一下“但它不起作用”的真正含义吗?当然,这是可以实现的,但这类事情通常需要一些调整。你可以使用mod_rewrite来完成,请参阅。谢谢,这就是我使用的答案。我指定
    RewriteRule ^([\w-]+)/([^/]*)-([^/]*)$ $1/$2+$3 [N]
    RewriteRule ^([\w-]+)/([^/]+)$ https://guides.freshlabs.group/search?query=$1 [R=302,L]