【问题标题】:Exclude multiple paths from htaccess rewrite rule从 htaccess 重写规则中排除多个路径
【发布时间】:2014-10-27 14:33:21
【问题描述】:

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

在此之前我有以下规则:

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

这意味着;

www.example.com/pages/contact 

从数据库返回一篇文章。现在我想改变它,让我的网址看起来像

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 或类似的东西会取得更好的结果。这是关于我的学习,如果我在这里挖了一个洞,请告诉我!

非常感谢, 亚当

【问题讨论】:

    标签: php regex apache .htaccess mod-rewrite


    【解决方案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”,这会转义非字母数字字符,例如“&”。

    【讨论】:

    • 效果很好!您介意解释一下代码的哪一部分使其跳过所有现有文件/目录吗?
    • 我在回答中添加了一些 cmets。基本上%{REQUEST_FILENAME} !-f 表示如果它不是一个文件,%{REQUEST_FILENAME} !-d 表示如果请求不是一个目录。
    • 完美运行,感谢您的详细说明将标记您的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多