1

你好,

我正在进行一个项目,我正在使用 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

就我所拥有的而言,第一条规则有效,但其余规则无效。

4

2 回答 2

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 是转发一个 URI /bar//bar.php如果它不是一个真实的目录并且实际上有一个文件 calle /bar.php。Rexex^(.*?)/?$用于去除尾部斜线(注意/bar/转到/bar.php)。

于 2013-04-08T17:43:45.890 回答
0

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

它需要是:

RewriteRule ^(.*)$ $1.php
RewriteRule ^portal/(.*)$ portal/index.php?page=$1 [L,QSA]
于 2013-04-08T17:38:20.537 回答