使用mod_rewrite将文件夹转换为查询字符串

时间:2009-04-02 14:58:14

标签: php .htaccess mod-rewrite

转换这些请求的最简单方法是什么:

http://www.example.com/en/
http://www.example.com/en/index.php

要:

http://www.example.com/index.php?language_id=en

有各种PHP文件,因此规则也需要映射

http://www.example.com/en/anyfile.php

要:

http://www.example.com/anyfile.php?language_id=en

语言ID可以是任何两个字母的代码(在PHP脚本中检查,以确保它有效)。

据推测,我需要使用.htaccess,并且非常感谢任何有关如何实现上述内容的建议。感谢。

更新

以下对我有用。

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ([a-z]+)/(css|js|images)/(.+) /$2/$3 [L]
  RewriteRule ([a-z]+)/(.+).php /$2.php?language_id=$1 [QSA,L]
  RewriteRule ([a-z]+)/$ /index.php?language_id=$1 [QSA,L]
</IfModule>

这也会将对css,js和images文件夹的请求重新路由回根文件夹。如果没有输入文件名,它也可以工作,自动重定向到index.php。

4 个答案:

答案 0 :(得分:2)

您可能希望在重写规则中添加QSA标志,该标志会将查询字符串上的任何附加位附加到重写的请求中,例如

RewriteRule magic here [PT,QSA]

答案 1 :(得分:1)

RewriteRule /([^/]+)/(.*) /$2?language_id=$1

答案 2 :(得分:0)

RewriteRule /en/(.*) /$1?language_id=en

它没有经过测试,但理论上它应该在en之后映射任何东西,因为?language_id = en

您也可以

RewriteRule /([a-zA-Z0-9+])/(.*) /$2?language_id=$1

这也应该映射

  

http://www.example.com/is/index.php

  

http://www.example.com/index.php?language_id=is

答案 3 :(得分:0)

我正在使用以下构造来获取友好的URL:

RewriteRule ^([^/]+)[/]{0,1}(.*)$ index.php?q=$2&language=$1 [L,QSA,NC]