Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess htaccess-从URL中删除查询字符串,但保留值_.htaccess_Variables_Url_Url Rewriting - Fatal编程技术网

.htaccess htaccess-从URL中删除查询字符串,但保留值

.htaccess htaccess-从URL中删除查询字符串,但保留值,.htaccess,variables,url,url-rewriting,.htaccess,Variables,Url,Url Rewriting,我已经搜索了Stackoverflow的所有地方,并在Google上搜索了很多地方,但我无法完成这项看似简单的任务 我试图在htaccess中设置一个规则,通过删除查询字符串来清除URL,但保留其值不变: http://example.local/?p=subscribe 变成: http://example.local/subscribe 我尝试过以下各种方法: RewriteEngine on RewriteCond %{QUERY_STRING} RewriteRule (.*) /$1

我已经搜索了Stackoverflow的所有地方,并在Google上搜索了很多地方,但我无法完成这项看似简单的任务

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

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

变成:

http://example.local/subscribe

我尝试过以下各种方法:

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

或者

但什么都不管用


任何帮助都将不胜感激。

您可以使用%检索rewriteCond变量

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

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

在您的.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]

对不起,不清楚你到底问了什么。“删除查询字符串”的确切含义是什么。浏览器中请求的URL是哪个?该URL应该被重写或重定向到哪个请求?基本上重写URL,以便删除查询字符串“?p=”。但不删除最后一部分“订阅”
/?p=subscribe
变为
/subscribe
谢谢你R.Martin,但结果是“404”错误:键入
http://tssl-list.dev/?p=preferences
未找到,url更改为:
http://tssl-list.dev/home/alan/Public/tssl-list/preferences
@AlanW:Try:
重写规则^$/%1?[R=301,L]
@anubhava-谢谢你,它几乎成功了。查询字符串消失,URL格式正确:
http://tssl-list.dev/preferences
。但是,它仍然抛出一个404未找到。我不确定这是否相关,但该网站实际上是一个phpList实现。完美谢谢你,阿努巴瓦,成功了。感谢您的帮助。新问题:我在live server上更新了.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讨论组中询问一下,看看是否可以对这种异常现象有任何见解。谢谢阿努巴瓦。
RewriteCond %{QUERY_STRING} ^p=(.*)$ [NC]
RewriteRule ^(.*)?$ %1? [R=301,L,NC]
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]