.htaccess重定向,如果存在任何查询字符串?

时间:2010-11-19 17:06:57

标签: .htaccess mod-rewrite

我目前有以下.htaccess。

<IfModule mod_suphp.c>
 suPHP_ConfigPath /home/abc/php.ini
</IfModule>

RewriteEngine on
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

AuthType Basic
AuthName "Está dominado!!"
AuthUserFile "/home/abc/.htpasswds/public_html/passwd"
require valid-user

现在问题是,如果在/删除该查询字符串后找到任何查询字符串,我想这样做。

所以: 如果我们有:

  

http://www.abc.com/ ?somethinghere234

它应该重定向到:

  

http://www.abc.com/

如果我们有:

  

HTPP://www.abc.com/something/ ID212

重定向到:

  

HTPP://www.abc.com/something/

更新: 我试过这个:

尝试A)

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule .* /index.php/ [L,QSA]

跳跃^(。*)$将允许查询字符串上的任何内容......

我也试过这个:

尝试B)

  

RewriteCond $ 1上的RewriteEngine   !^(index.php文件|媒体| CSS | JS |图片|的robots.txt)   RewriteCond%{QUERY_STRING} ^(。)$   RewriteRule ^(。)$ http://abc.com/ [L]

这会返回500内部服务器错误。

尝试C)

RewriteEngine on
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt)
#RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ http://abc.com/ [R=302,L]

我承认我在这个.htaccess sintax上有点迷失。

尝试D)

RewriteEngine on
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt)
RewriteCond %{REQUEST_URI} !^/
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ http://abc.com/ [R=302,L]

请指教, MEM

4 个答案:

答案 0 :(得分:5)

以下内容应该有效:

RewriteCond %{QUERY_STRING} .
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^ /index.php/? [L]
  1. 检查QUERY_STRING中是否有东西(你的也接受一个空字符串)
  2. 您的支票以防止无休止的重定向
  3. 重定向到您想要的任何位置。
  4. 来自Apache文档:

      

    如果要删除现有内容   查询字符串,结束替换   字符串只有一个问号

    编辑(再次):作为外部重定向(如果您的应用程序中根本没有任何查询字符串,则可能甚至不需要第二个RewriteCond):

    这将告诉客户端请求不带查询字符串的相同URI。

    RewriteEngine on
    
    # redirect to same URI, but without query string
    RewriteCond %{QUERY_STRING} .
    RewriteRule ^ %{REQUEST_URI}? [R=301]
    
    # CodeIgniter "magic"
    RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt)
    RewriteRule ^(.*)$ /index.php/$1 [L]
    

答案 1 :(得分:2)

我从你的描述中确切地知道你所追求的是什么,所以你应该根据你的具体需要保留或删除第二个RewriteCond。

RewriteEngine On

# Remove the query string with a redirect
RewriteCond %{QUERY_SRING} !=""
# But only if the path ended with a /
# (remove this to redirect anything with a query string)
RewriteCond %{REQUEST_URI} /$
RewriteRule .* /$0? [R=301,L]

# Then perform your internal rewrite
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

答案 2 :(得分:1)

可能是因为你在那里添加了 QSA - 这意味着查询字符串追加

答案 3 :(得分:0)

RewriteCond %{REQUEST_URI} ^(.*/)([^/]+)$
RewriteRule . %1 [R=301,L]