捕获所有url实例/ /但不是文件

时间:2013-04-09 19:37:44

标签: .htaccess url-rewriting rewrite

我在工作中使用Code Igniter项目时学到了一些关于MVC的知识,所以我正在努力实现这个目标:

在: 的index.php somepage.php secondpage.php

所有这些文件都有“include(header)和include(footer)等等......

相反,我想从网址中捕获用户正在寻找的页面 - >将它们重定向到索引,并始终在该位置加载页眉和页脚,唯一改变的是内容。

所以我用我的htaccess做了这个:

<IfModule mod_rewrite.c>
   Options +FollowSymLinks
   Options +Indexes
   RewriteEngine On
   RewriteCond %{SCRIPT_FILENAME} !-d
   RewriteCond %{SCRIPT_FILENAME} !-f
   RewriteRule (.*)/(.*)/(.*)/(.*)/(.*)/(.*) index.php?page=$1&child=$2&grandchild=$3&cousin=$4&aunt=$5&uncle=$6 [NC,QSA,L]
   RewriteRule (.*)/(.*)/(.*)/(.*)/(.*) index.php?page=$1&child=$2&grandchild=$3&cousin=$4&aunt=$5 [NC,QSA,L]
   RewriteRule (.*)/(.*)/(.*)/(.*) index.php?page=$1&child=$2&grandchild=$3&cousin=$4 [NC,QSA,L]
   RewriteRule (.*)/(.*)/(.*) index.php?page=$1&child=$2&grandchild=$3 [NC,QSA,L]
   RewriteRule (.*)/(.*) index.php?page=$1&child=$2 [NC,QSA,L]
   RewriteRule (.*^.css) index.php?page=$1 [NC,QSA,L]
</IfModule>

有了心态,如果它起作用,它是一个开始..但它不起作用。首先我注意到我的css没有加载..显然-f没有帮助所以我添加了规则,但是然后/img/bg.png也不起作用..

我希望很明显,我正在尝试捕获url中/ /之间的任何单词,并将它们作为参数传递给索引。你们知道是否有任何智能重写规则实际上忽略了文件存在时的重写?

2 个答案:

答案 0 :(得分:1)

RewriteCond应用于下一个,在您的情况下,第一个RewriteRule。如果要将它用于每个RewriteRule,则必须复制它

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*?)/(.*?)/(.*?)/(.*?)/(.*?)/(.*?) index.php?page=$1&child=$2&grandchild=$3&cousin=$4&aunt=$5&uncle=$6 [QSA,L]

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*?)/(.*?)/(.*?)/(.*?)/(.*) index.php?page=$1&child=$2&grandchild=$3&cousin=$4&aunt=$5 [QSA,L]

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*?)/(.*?)/(.*?)/(.*?) index.php?page=$1&child=$2&grandchild=$3&cousin=$4 [QSA,L]
...

此处不需要[NC]标志,因为该模式不包含任何字母字符。

我还稍微修改了模式,使用^作为URL路径的开头和非贪婪版本.*?,这使得捕获在第一个斜杠处停止。

答案 1 :(得分:0)

我改变了我的逻辑。 我现在检测到哪个页面,并将其余页面保存到变量设置中, 这只适用于thr?之后。*正如你的建议:

最终解决方案:

<IfModule mod_rewrite.c>
   Options +FollowSymLinks
   Options +Indexes
   RewriteEngine On
   RewriteCond %{SCRIPT_FILENAME} !-d
   RewriteCond %{SCRIPT_FILENAME} !-f
   RewriteRule ^(.*?)/(.*) index.php?page=$1&settings=$2 [QSA,L]

   RewriteCond %{SCRIPT_FILENAME} !-d
   RewriteCond %{SCRIPT_FILENAME} !-f
   RewriteRule ^(.*) index.php?page=$1 [QSA,L]
</IfModule>