将丑陋的查询字符串更改为更漂亮的/ path / to / page / pattern

时间:2014-08-25 04:12:10

标签: php regex .htaccess

我有一个网站,它使用自定义查询字符串向访问者提供网页。示例查询字符串看起来像/?sec=news&pg=current&bg=203。我想使用.htaccess将字符串重写为/news/current/203之类的模式。

我知道如何获取/news/current/203 URL并将其转换为可以使用PHP解析的查询字符串。我通常使用这个htaccess代码:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*) /index.php?id=$1 [L]```

然后我的PHP在id上爆炸/,然后我们正在运行。

我的问题是这样的...我如何在这个htaccess代码中添加更多行,这将允许旧的URL查询模式继续适用于具有使用/?sec=news...模式的书签或链接的人?基本上,似乎我需要使用这个旧的查询字符串并将值组合成一个字符串,我可以将其传递给id参数中的index.php。我不想失去尊重旧模式的能力,还需要推广新的基于路径的清洁字符串。

我知道有一些正则表达式可以帮到这里,但我很难理解正则表达式。任何帮助将不胜感激,如果我没有任何意义,请告诉我。


更新:提供的答案使我的最终htaccess文件看起来像这样......

RewriteEngine on

# Prevent directory listings
Options All -Indexes

# Rewrite to www
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^sample.com[nc]
RewriteRule ^(.*)$ http://www.sample.com/$1 [r=301,nc]

# WHEN DONE TESTING< CHANGE ALL 302 to 301 !!!
# Honor the old format /index.php?sec=XXX&pg=XXX&bg=XXX and turn it into the new format
RewriteCond %{QUERY_STRING} sec=(\w+)&pg=(\w+)&bg=(\d+)
RewriteRule ^(.*)$ /%1/%2/%3? [R=302,L]

# Turn /path/to/page into index.php?id=path/to/page
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*) /index.php?id=$1 [L]

1 个答案:

答案 0 :(得分:2)

添加此规则

RewriteCond %{QUERY_STRING} sec=(\w+)&pg=(\w+)&bg=(\d+)
RewriteRule ^(.*)$ /%1/%2/%3? [R=302,L]

将302更改为301