.htaccess重定向问号,不带参数

.htaccess重定向问号,不带参数,.htaccess,redirect,mod-rewrite,.htaccess,Redirect,Mod Rewrite,我有几个带有问号的URL需要删除。例如,我需要重定向此URL: http://example.net/?/services http://example.net/services 要访问此URL,请执行以下操作: http://example.net/?/services http://example.net/services 我有很多类似的东西,所以我想要的东西,可以抓住一切与问号,并正确重定向它。我找到的许多答案都试图使用QUERY\u STRING作为重写的条件,但如果没有参数,这

我有几个带有问号的URL需要删除。例如,我需要重定向此URL:

http://example.net/?/services
http://example.net/services
要访问此URL,请执行以下操作:

http://example.net/?/services
http://example.net/services
我有很多类似的东西,所以我想要的东西,可以抓住一切与问号,并正确重定向它。我找到的许多答案都试图使用
QUERY\u STRING
作为重写的条件,但如果没有参数,这是没有帮助的。经过一番挖掘,我发现一个
RewiteCond
可以工作,但是
RewriteRule
重定向到主页,而不是没有问号的URL。我目前拥有的是:

# Remove question mark from string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(index\.php)?\?([^&\ ]+)
RewriteRule ^ /%1? [L,R=301]

# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
第一块是到目前为止我已经完成的重写,接下来两块是CMS url路由。似乎发生的是,我在第一个块中的重写没有保留url的其余部分。我尝试了几种组合,但似乎不知道如何保持url的其余部分完好无损

我找到的许多答案都试图使用QUERY_字符串作为重写的条件,但如果没有参数,这就没有帮助

是的,这正是第一个带有问号的URL所包含的内容。所以,我不知道为什么“这没用”?在URL
http://example.net/?/services
/services
是查询字符串。是否存在键/值对(即“参数”)无关紧要

重定向表单的URL
http://example.net/?/services
,不包含URL路径,只包含一个查询字符串,请尝试以下操作:

# Remove question mark from string
RewriteCond %{QUERY_STRING} ^/(.+)
RewriteRule ^$ /%1? [R,L]
%1
是对上次匹配的CondPattern(即捕获
服务的
(.+)
)中捕获的组的反向引用。这假设查询字符串(在
之后)总是以斜杠开头,如您的示例所示。(顺便说一句,这也是你的前控制器正在做的,相反,所以我认为它一定是正确的。)

替换的尾部
从请求中删除原始查询字符串

确保清除浏览器缓存,因为任何早期/错误的301s都将被浏览器缓存

如果这是一个永久(301)重定向,则将
R
更改为
R=301
,但仅当您确定它工作正常时

我找到的许多答案都试图使用QUERY_字符串作为重写的条件,但如果没有参数,这就没有帮助

是的,这正是第一个带有问号的URL所包含的内容。所以,我不知道为什么“这没用”?在URL
http://example.net/?/services
/services
是查询字符串。是否存在键/值对(即“参数”)无关紧要

重定向表单的URL
http://example.net/?/services
,不包含URL路径,只包含一个查询字符串,请尝试以下操作:

# Remove question mark from string
RewriteCond %{QUERY_STRING} ^/(.+)
RewriteRule ^$ /%1? [R,L]
%1
是对上次匹配的CondPattern(即捕获
服务的
(.+)
)中捕获的组的反向引用。这假设查询字符串(在
之后)总是以斜杠开头,如您的示例所示。(顺便说一句,这也是你的前控制器正在做的,相反,所以我认为它一定是正确的。)

替换的尾部
从请求中删除原始查询字符串

确保清除浏览器缓存,因为任何早期/错误的301s都将被浏览器缓存

如果这是一个永久(301)重定向,则将
R
更改为
R=301
,但仅当您确定它工作正常时