.htaccess redirect&美化查询字符串

时间:2016-08-18 08:28:29

标签: .htaccess redirect mod-rewrite clean-urls

这就是我想要实现的目标:

浏览器请求:example.com/webApp/controller/action/?param1=param1value

  • 网址的静态(始终相同)部分为webApp/
  • 网址的动态部分为controller/action/?param1=param1value。通常它由REQUEST_URI(由不同数量的部分组成的路径)和QUERY_STRING组成,它可以是任何东西,例如:
    • site/index/?page=2
    • books/index/?page=2&sort=name
    • users/list
    • foo/bar
    • user/profile/posts/?page=2
  • 在.htaccess(服务器收到的内容)之后,上面列出的网址应如下所示:
    • index.php?path=site/index/page/2
    • index.php?path=books/index/page/2/sort/name
    • index.php?path=users/list
    • index.php?path=foo/bar
    • index.php?path=user/profile/posts/page/2
  • 当用户在浏览器中看到没有index.php部分的网址时:
    • site/index/page/2
    • books/index/page/2/sort/name
    • users/list
    • foo/bar
    • user/profile/posts/page/2

基本上我想通过将所有QUERY_STRING?字符替换为&来清除网址的/部分,并将其动态地附加到REQUEST_URI

我一直在做很多关于这个话题的搜索。不幸的是,最接近的匹配是硬编码QUERY_STRING参数转换为路径的示例。相反,我希望动态地将所有QUERY_STRING部分(如果有的话)转换为路径。

我当前的 .htaccess 文件内容如下:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.bmp|\.css|\.js)$
RewriteRule ^([^?]*)$ index.php?path=$1 [NC,L,QSA]

唯一缺少的部分是清除QUERY_STRING,如上所述。此外,如果请求URI是上面代码中列出的文件(扩展名列表),则不会通过index.php处理。

1 个答案:

答案 0 :(得分:0)

我已使用以下.htaccess代码部分解决了该问题:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.bmp|\.css|\.js)$

RewriteCond %{QUERY_STRING} ^(.*)=(.*) [OR]
RewriteRule ^([^?]*)$ index.php?path=$1&%1=%2 [NC,L]
  • QUERY_STRING不再附加在网址末尾(QSA已移除RewriteRule)。
  • 相反,QUERY_STRING与条件RewriteCond %{QUERY_STRING} ^(.*)=(.*) [OR]匹配,后来在%1中包含代币%2RewriteRule时使用。
  • 此解决方案不会从网址中删除GET参数,但确保它们不会以path参数结束。
    • 相反,查询字符串正常工作并创建自己的GET参数条目(因为它现在以&而不是?开头。?已用于参数{{1 }}。
    • 第一篇文章中描述的情况导致查询字符串格式错误,因为"第一个参数字符path"使用两次。至少这是我的假设..