如何使用htaccess来做到这一点?

时间:2013-10-07 22:00:26

标签: php .htaccess url rewrite

我在这一点上遇到了困难,我正试图弄清楚为什么它不能正常工作!

这是想让网址看起来像

 example.com/news/top/

 example.com/index.php?view=news&task=top

但我需要的是“任务”可以是不同的东西,如

 example.com/index.php?view=news&task=newest
 example.com/index.php?view=news&task=help
 example.com/index.php?view=news&task=write
 ....

当前.htaccess看起来像:

DirectoryIndex index.php
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+) index.php?view=$1&task=$2

如果我访问www.example.com/news/ - >它只加载index.php但不通过?view = news

如果我访问www.example.com/news/top/ - >它运作得很好。

但是我需要它们才能工作,为.htaccess添加一个新行,如:

RewriteRule ^news/ index.php?view=news

然后访问www.example.com/news/工作正常,但访问www.example.com/news/top/将无法获得任务的价值。

请帮助我!

提前谢谢。

2 个答案:

答案 0 :(得分:1)

尝试将这些规则添加到文档根目录中的htaccess文件中:

RewriteEngine On

# Redirect access to index.php
RewriteCond %{THE_REQUEST} \ /index\.php\?view=([^&]+)&task=([^&\ ]+)
RewriteRule ^ /%1/%2/? [L,R=301]

# rewrite to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?view=$1&task=$2 [L]

首先将/index.php?view=news&task=foo之类的请求重定向到/news/foo/。然后,第二条规则在内部将/news/foo/之类的请求重新设置回/index.php?view=news&task=foo

如果您的所有链接看起来都像/news/foo/,那么您将不需要第一条规则。

答案 1 :(得分:0)

我不是老将,但这样的事可能有用:

RewriteRule /news/(.*) /index.php?view=news&task=$1 [L]

这应该将所有对/ news / abc的请求重写为index.php?task = news& view = abc。反向引用$1代表RegEx中第一个被括号括起来的模式。