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
到
因此,我想:
如何查找您的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的查询字符串部分中的+
被接收服务器视为编码空间。)重写规则
中包含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]