我试图重定向到新域,同时保留查询字符串,但以修改的方式。
例如,我要重定向:
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
所以我想:
从原始URL(how-to-find-your-amazon-affiliate-key-secret-key
)中获取最后一个“文件夹”
将-
替换为+
将结果追加到https://guides.freshlabs.group/search?query=
并使用301重定向
我尝试了几件事,对.htaccess
有所了解,但这让我很困惑
更新
结合使用.htaccess
和PHP可以更容易。我可以使用.htaccess
将所有URL重写为index.php
,然后使用PHP替换字符并重定向吗?
答案 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]
第一条规则重复(内部)用第二条路径段中的-
替换所有+
(连字符)的请求。 N
(next
)标志显式触发重写循环。应谨慎使用;与任何类似递归的行为一样,它需要在某些时候失败。 (注意:URL路径中的+
只是文字+
。)
一旦所有连字符被替换,第二条规则将触发外部重定向到另一个域,将第二个路径段(现在包含+
)复制到目标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]