.htaccess已删除文件扩展名并进行路由

时间:2013-04-08 17:34:48

标签: php .htaccess mod-rewrite

您好,

我正处于项目中间,我正在使用Mod_Rewrite和.htaccess来更改某些URL。我希望删除文件扩展名,但是一旦用户登录,他们会转到名为portal的文件夹,然后/portal/index.php会运行所有页面。

以下是我目前的代码:

RewriteRule ^(.*)$ $1.php
RewriteRule ^portal/(.*)$ portal/index.php?page=$1 [L,QSA]

这不行,但我觉得我接近我希望的最终结果。

页面的URL应该是:

site.com/home
site.com/otherpage

等等。这些应该发送到:

/home.php
/otherpage.php

但是一旦用户登录,URL:

site.com/portal/index.php?page=section/section2/so-on

应该重写为:

site.com/portal/section/section2/so-on

凭借我拥有的,第一条规则有效,但其余规则不起作用。

2 个答案:

答案 0 :(得分:1)

始终在.htaccess中保持规则的顺序从最具体到最通用。你完整的.htaccess应该是:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^portal/(.*)$ /portal/index.php?page=$1 [L,QSA,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

<强>解释

规则1很简单。它将每个不是物理文件的/portal/foo URI转发给/portal/index.php?page=foo。最后一条规则的标志L,QSA用于附加现有的查询字符串,NC用于忽略大小写匹配。

规则2将/bar/之类的URI转发到/bar.php,如果它不是真实目录,并且实际上存在文件calle /bar.php。 Rexex ^(.*?)/?$用于删除尾部斜杠(注意/bar/转到/bar.php)。

答案 1 :(得分:0)

您需要重新排序规则,因为第一个将/ portal / section / section2 / so-on发送到/ portal / section / section2 / so-on。

需要:

RewriteRule ^(.*)$ $1.php
RewriteRule ^portal/(.*)$ portal/index.php?page=$1 [L,QSA]