apache - htaccess 使用 GET 参数重定向 URL
问题描述
我有一个格式为的 URLhttp://www.example.com/?s=query
我想将此 URL 重定向到http://www.example.com/search/query
我有以下内容.htaccess
,但我想检查这是否有任何问题。我的RewriteRule
看起来有点不稳定,我不知道它是否会导致其他 URL 出现问题。
RewriteEngine on
RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC]
RewriteRule ^$ /search/%1? [NC,L,R]
我在这里进行了测试,它似乎重定向到正确的 URL。
解决方案
RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC] RewriteRule ^$ /search/%1? [NC,L,R]
如果您收到 % 编码的 URL 参数值,您可能需要指令上的NE
( noescape
) 标志,否则目标 URL 将被双重编码。服务器变量不被 Apache 解码RewriteRule
。QUERY_STRING
它还取决于您如何重写/search/query
(/?s=query
或者可能更像/index.php?s=query
?) - 大概您已经在稍后的配置中这样做了?您只希望此重定向应用于直接请求而不是重写请求(否则您将获得重定向循环)。确保这一点的一种简单方法是检查REDIRECT_STATUS
env var 是否为空。
例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^s=(.*) [NC]
RewriteRule ^$ /search/%1 [NE,QSD,R,L]
其他要点:
- 该
QSD
标志将更可取(在 Apache 2.4 上)附加?
到替代字符串的末尾以删除查询字符串。 - 正则表达式
^s=(.*)
(尾随$
是多余的)确实假定这s
是查询字符串开头的唯一 URL 参数。就目前而言,一切都被假定为该值的一部分。例如。s=foo&bar=1
将导致/search/foo&bar=1
. - 指令上的
NC
标志是多余的。RewriteRule
- 你也应该检查
/index.php?s=<query>
吗?(或者任何文件/目录索引正在处理请求。)
推荐阅读
- r - 循环问题:根据增加的值创建名称以读取 CSV 文件
- flutter - 我正在尝试从我的 Firebase 实时数据库中检索数据,但它让我为空?
- java - 如何使用适用于 android 11 的媒体存储 api 将视频或图像文件从一个位置复制到另一个位置
- c# - Web API Post 参数 Null
- html - 如何从本地文件夹在html中添加背景图像
- c# - 如何获取特定日期和算法
- ios - 我在虚幻引擎中构建项目时遇到了这个问题。谁能帮我
- java - 如何测试模拟一项服务但在java中监视另一项服务?
- cypress - cypress 无法单击登录按钮。收到发布错误
- javascript - MySQL 数据库的 NodeJS Knex 数据库回退