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

时间:2019-01-13 14:32:23

标签: .htaccess redirect mod-rewrite url-redirection

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

例如,我要重定向:

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

https://guides.freshlabs.group/search?query=how+to+find+your+amazon+affiliate+key+secret+key

所以我想:

  1. 从原始URL(how-to-find-your-amazon-affiliate-key-secret-key)中获取最后一个“文件夹”

  2. -替换为+

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

我尝试了几件事,对.htaccess有所了解,但这让我很困惑

更新

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

2 个答案:

答案 0 :(得分:0)

使用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]

此规则集将在动态配置文件(“ .htaccess”样式文件)的http服务器主机配置中同样起作用。


更新:

我意识到您要转换的示例字符串包含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]

注意:我没有对此进行测试,只是将其写下来,所以那里可能存在一些较小的故障。它应该可以工作。它实现了多种重写策略:它以单独的方式重写每个令牌,并在初步查询参数中“存储”该令牌。令牌被逐一组装,直到执行最终的外部重定向为止,因为请求中不再存在要转换的令牌。


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

答案 1 :(得分:0)

您可以使用.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]
  1. 第一条规则重复(内部)用第二条路径段中的-替换所有+(连字符)的请求。 Nnext)标志显式触发重写循环。应谨慎使用;与任何类似递归的行为一样,它需要在某些时候失败。 (注意:URL路径中的+只是文字+。)

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

请注意,这是一个临时(302)重定向。一旦确认它可以正常工作,请仅将其更改为301(永久),以避免缓存问题。

在测试之前清除浏览器缓存。

  

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

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


更新:

  

第一个“文件夹”可以不同(例如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]