将各种查询字符串URL重定向到非查询URL

时间:2018-01-08 22:44:46

标签: .htaccess redirect

我已经看过很多关于如何使用具有数字的查询(例如foo.php?id=21)执行此操作的示例。但是,我所追求的这种重定向是针对数百个URL但它们具有相同的模式,尽管某些键值对中会有%20。以下是三个示例,然后是我需要它们重定向到的内容:

photo/search.php?keywords=foogallery/search/foo photo/search.php?keywords=foo%20bargallery/search/foo-bar photo/search.php?keywords=major%20foo%20bargallery/search/major-foo-bar

我只是不确定如何为数百个网址执行此操作。

[编辑 - 在下面添加]

以下是我现在主要工作的内容:

# Recursively replace spaces with hyphens until there are none left
RewriteCond %{QUERY_STRING} ^([^\s%20]*)[\s%20]+(.*)$
RewriteRule ^(.+)$ $1?%1-%2 [E=NOSPACE:1]
# When there is no space make an external redirection
RewriteCond %{ENV:NOSPACE} =1
RewriteCond %{QUERY_STRING} ^keywords=([^&]+)$
RewriteRule ^photo/search\.php$ /gallery/search/%1? [L,R=301]

我的新问题是,如果有多个空格,第二个%符号也会被编码,因此重定向的URL最终会出错。例如:

这:http://example.com/photo/search.php?keywords=some%20keywords%20here

转到此:http://example.com/gallery/search/some-keywords%2520here

但它应该是:http://example.com/gallery/search/some-keywords-here

1 个答案:

答案 0 :(得分:0)

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /photo/search\.php
RewriteCond %{QUERY_STRING} keywords=([^&]+)
RewriteRule ^/?photo/search.php$ /gallery/search/%1? [NE,R,L]

RewriteRule ^/?gallery/search/([^/]+)$ /photo/search.php?keywords=$1 [L]

第1 - 3行:检查请求行(e.g., "GET /index.html HTTP/1.1"),请求路径为/photo/search.php,如果包含查询字符串keywords=,请将请求uri从/photo/search.php重定向至/gallery/search/%1?%1([^&]+)的反向引用,?删除任何查询字符串。

第4行:内部重写从/gallery/search/([^/]+)/photo/search.php?keywords=$1的网址,$1是对([^/]+)的反向引用。

如果从关键字中检测到空格,您可能需要php脚本的一些帮助,重定向到短划线。

if (isset($_GET['keywords']) && stripos($_GET['keywords'], ' ') !== false) {
    header('location: /gallery/search/' . urlencode(str_replace(' ', '-', $_GET['keywords'])));
    exit;
}