【问题标题】:.htacces redirection with query strings.htaccess 使用查询字符串重定向
【发布时间】:2026-02-07 03:50:01
【问题描述】:

我创建了一个 .htacces 文件,它执行以下操作:

  • / 重定向到/.index/(在地址栏中可见)

  • /hu/en 重定向到/.index/hu/.index/en(在地址栏中可见)

然后

  • /.[p]/[l] 等请求重定向到/index.php?page=[p]&lang=[l](在地址栏中不可见)

但是..

我想在末尾保留查询字符串,这意味着访问/.[p]/[l]?a=b 会导致对/index.php?page=[p]&lang=[l]&a=b 的请求

我似乎无法让正则表达式为此工作。这是整个 .htaccess 文件:

RewriteEngine On
RewriteBase /Main/djdavid98/

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(hu|en)?(\/?(\?(([\S]+\=[\S]+)*))?)?$ ./.index/$1$3 [R=301,L]
RewriteRule ^\.([\w\d]+)(\/(hu|en))?\/?(\?(([\S]*=[\S]*)+))?$ index.php?page=$1&lang=$3&$5

【问题讨论】:

    标签: .htaccess mod-rewrite apache2


    【解决方案1】:

    使用QSA flag for RewriteRule 将任何已经存在的查询字符串附加到您在规则目标中构建的字符串的末尾:

    RewriteRule ^\.([\w\d]+)(\/(hu|en))?\/?(\?(([\S]*=[\S]*)+))?$ index.php?page=$1&lang=$3&$5 [L,QSA]
    

    请注意,查询字符串会自动附加到末尾,除非您在规则的目标中构建了自己的字符串。这就是为什么第一条规则会保留查询字符串,而第二条规则不会。

    【讨论】: