.htaccess重定向没有参数的问号

时间:2017-07-05 17:13:42

标签: .htaccess redirect mod-rewrite

我有几个带有问号的网址需要删除。例如,我需要重定向此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。我已经尝试了几种组合,但似乎无法弄清楚如何保持其余网址的完整性。

1 个答案:

答案 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,但只有当您确定它正常工作时才会这样做。