【问题标题】:htaccess - Remove Query String from URL but Leave Valuehtaccess - 从 URL 中删除查询字符串但保留值
【发布时间】:2019-01-08 20:10:19
【问题描述】:

我已经在 Stackoverflow 上搜索了所有内容,并在 Google 上进行了广泛搜索,但我无法完成这个看似简单的任务。

我正在尝试在 htaccess 中设置一个规则,通过删除查询字符串来清理 URL,但保持其值不变:

http://example.local/?p=subscribe

变成:

http://example.local/subscribe

我尝试了以下各种方法:

RewriteEngine on
RewriteCond %{QUERY_STRING}
RewriteRule (.*)  /$1? [R=301,L]

或者,

RewriteCond %{QUERY_STRING} ^p=$ [NC]
RewriteRule ^(/?)?$ $1? [R=301,L,NC]

或者,

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\?([^\ ]+)
RewriteRule ^$ /%1? [R=301,L]

但没有任何效果!

任何帮助将不胜感激。

【问题讨论】:

  • 抱歉,不清楚您的实际要求。 究竟是什么意思“删除查询字符串”。浏览器中请求的 URL 是哪个,该 URL 应该被重写或重定向到哪个请求?
  • 基本上重写了 url,这样查询字符串 "?p=" 就被删除了。但不删除最后一部分“订阅”。 /?p=subscribe 变为 /subscribe

标签: .htaccess variables url url-rewriting


【解决方案1】:

在你的 .htaccess 中这样写:

RewriteEngine On

RewriteCond %{THE_REQUEST} \s/([^?]*?)/?\?p=([^\s&]+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w-]+)/?$ ?p=$1 [L,QSA]

【讨论】:

  • 完美! - 谢谢阿努巴瓦,这成功了。感谢您的帮助。
  • 新问题:我更新了实时服务器上的 .htaccess,其中 phpList 位于子目录中:http://example.com/mailinglist/?p=subscribe 现在规则不再有效。我尝试将RewriteBase /mailinglist/ 添加到规则集中,但它什么也没做。我还尝试删除尾随的/ 破折号,甚至在我认为可行的地方输入mailinglist/。救命!
  • .htaccess 文件位于/mailinglist 子目录中。父级 example.com 是一个 Wordpress 安装,带有它自己的单独的 htaccess 文件。
  • 嗯,使用更新后的代码,站点首先重定向到http://example.com/mailinglist//subscribe(是的,这是两个斜线),但在它重定向回根http://example.com/mailinglist/之后立即。
  • 是的,双斜线不见了。但不知何故,所有链接都无缘无故地重定向到根目录。我不是程序员,但也许这种行为是由 phpList 中的 php 代码中的某些内容触发的。我应该澄清重定向是这样发生的:http://example.com/mailinglist/?p=subscribe -> http://example.com/mailinglist/subscribe -> http://example.com/mailinglist/。也许我应该在 phpList 讨论组中查询,看看我是否可以对这个异常有任何见解。谢谢阿努巴瓦。
【解决方案2】:

您可以使用 % 来检索 rewriteCond 变量

RewriteCond %{QUERY_STRING} ^p=(.*)$ [NC]
RewriteRule ^(.*)?$ %1? [R=301,L,NC]

将任何网址 http:/site.com/url?qs 转换为 http:/site.com/qs

【讨论】:

  • 谢谢 R. Martin,但结果是“404”错误:找不到键入 http://tssl-list.dev/?p=preferences 并且 url 更改为:http://tssl-list.dev/home/alan/Public/tssl-list/preferences
  • @AlanW:试试看:RewriteRule ^$ /%1? [R=301,L]
  • @anubhava - 谢谢,它几乎成功了。查询字符串确实消失了,并且 URL 格式正确:http://tssl-list.dev/preferences。但是,它仍然会抛出 404 Not Found
  • 我不确定这是否相关,但该站点实际上是一个 phpList 实现。
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 2012-04-26
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多