【问题标题】:.htaccess redirect question mark with no parameters.htaccess 不带参数的重定向问号
【发布时间】:2017-07-05 17:13:42
【问题描述】:

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

http://example.net/?/services

到这个网址:

http://example.net/services

我还有很多这样的东西,所以我想要一些可以用问号捕获所有内容并正确重定向它的东西。我发现的许多答案都试图使用QUERY_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 的其余部分完好无损。

【问题讨论】:

    标签: .htaccess redirect mod-rewrite


    【解决方案1】:

    我找到的许多答案都试图使用 QUERY_STRING 作为重写的条件,但没有参数这无济于事。

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

    要重定向 http://example.net/?/services 形式的 URL,它不包含 URL 路径而仅包含查询字符串,请尝试以下操作:

    # Remove question mark from string
    RewriteCond %{QUERY_STRING} ^/(.+)
    RewriteRule ^$ /%1? [R,L]
    

    %1 是对最后匹配的CondPattern 中捕获组的反向引用(即(.+),它捕获services)。这假定查询字符串(在? 之后)始终以斜杠开头,如您的示例所示。 (顺便说一句,这也是你的前端控制器正在做的事情,相反,所以我认为它一定是正确的。)

    替换上的尾随? 会从请求中删除原始查询字符串。

    确保清除浏览器缓存,因为任何较早/错误的 301 都会被浏览器缓存。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 2014-04-29
      • 1970-01-01
      相关资源
      最近更新 更多