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