您好,
我正处于项目中间,我正在使用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
凭借我拥有的,第一条规则有效,但其余规则不起作用。
答案 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]