从htaccess重写规则中排除多个路径

时间:2014-09-03 07:16:18

标签: php regex apache .htaccess mod-rewrite

我创建了一个新功能,希望能够实现面包屑和更好的URL结构。

在此之前,我有以下规则:

RewriteRule ^pages/([a-z0-9,&-]+)/?$ ?action=viewArticleName&page_identifier=$1 [L,NC,QSA,B]

这意味着;

www.example.com/pages/contact 

从DB返回了一篇文章。现在我想改变它,所以我的网址看起来像

www.example.com/categoryname/pagename

所以我的工作重写规则:

RewriteRule ^([^/]+)/([^/]+)$ /?action=viewCategoryName&categoryName=$1&page_identifier=$2 [L]

问题是这个RewriteRule会导致/ images中包含的任何图像加载文章的附带模板。

我可以想到三种可能的解决方案,但不是实际的代码:

1)我可以创建一个类别名称数组吗?然后,我可以以某种方式使RewriteRule仅适用于这些名称。

2)创建一个包含一些全局设置的类。在这有一些PHP定义或设置图像路径。我能想到的只是;

define( "IMAGE_PATH", "//example.com/images" ); 

3)向Htacces文件添加内容以从规则中排除某些路径。

我知道MVC或类似的会取得更好的结果。这是关于我的学习,请告诉我,如果我在这里偷了一个洞!

非常感谢, 亚当

1 个答案:

答案 0 :(得分:1)

您可以通过此重写跳过所有现有文件和目录,以防止所有图片受到此新规则的影响:

# skip all existing files
RewriteCond %{REQUEST_FILENAME} !-f
# skip all existing directories
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ /?action=viewCategoryName&categoryName=$1&page_identifier=$2 [L,QSA,B]

注意,将'B'添加到标记中,这会转义非字母数字字符,例如'&'。