我有几个带有问号的网址需要删除。例如,我需要重定向此URL:
http://example.net/?/services
到此网址:
http://example.net/services
我还有更多这样的东西,所以我希望能够用问号抓住所有内容并正确地重定向它。我发现的许多答案都试图使用QUERY_STRING
作为重写的条件,但没有参数这没有用。经过一番挖掘后,我发现RewiteCond
有效,但RewriteRule
重定向到主页,而不是没有问号的网址。我现在的目的是:
# 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。我已经尝试了几种组合,但似乎无法弄清楚如何保持其余网址的完整性。
答案 0 :(得分:0)
我发现的许多答案都是尝试使用QUERY_STRING作为重写的条件,但是如果没有参数则无效。
是的,这正是带有问号的第一个网址所包含的内容。所以,我不确定为什么“这没有帮助”?在网址http://example.net/?/services
中,/services
是查询字符串。是否存在键/值对(即“参数”)是无关紧要的。
要重定向http://example.net/?/services
形式的网址,其中包含无网址路径且只包含查询字符串,请尝试以下操作:
# Remove question mark from string
RewriteCond %{QUERY_STRING} ^/(.+)
RewriteRule ^$ /%1? [R,L]
%1
是对最后匹配的 CondPattern (即。(.+)
中捕获的组的反向引用,它捕获services
)。这假设查询字符串(在?
之后)始终以斜杠开头,如示例所示。 (顺便说一句,这也是你的前端控制器正在做的事情,反过来,所以我认为它必须是正确的。)
替换上的尾随?
会从请求中删除原始查询字符串。
确保清除浏览器缓存,因为浏览器会缓存任何早期/错误的301.
如果这是一个永久性(301)重定向,那么请将R
更改为R=301
,但只有当您确定它正常工作时才会这样做。