Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从htaccess重写规则中排除多个路径_Php_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

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

Php 从htaccess重写规则中排除多个路径,php,regex,apache,.htaccess,mod-rewrite,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 从数据库返回了一篇文章。现在我想改变这个,让我的URL看起来像 www.example.com/categoryname/pagename

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

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

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

www.example.com/pages/contact 
从数据库返回了一篇文章。现在我想改变这个,让我的URL看起来像

www.example.com/categoryname/pagename
因此,我的工作重写规则是:

RewriteRule ^([^/]+)/([^/]+)$ /?action=viewCategoryName&categoryName=$1&page_identifier=$2 [L]
问题是此重写规则导致从/images中包含的任何图像加载文章的包含模板

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

1) 我可以创建一个类别名称数组吗?然后我就可以让重写规则只适用于这些名字

2) 创建一个类以包含一些全局设置。在本文中,我们将使用一些php来定义或设置图像路径。我所能想到的就是

define( "IMAGE_PATH", "//example.com/images" ); 
3) 向Htacces文件中添加某些内容以从规则中排除某些路径

我知道MVC或类似的软件会取得更好的效果。这是关于我的学习,请告诉我我是否在这里挖了个洞

非常感谢,,
Adam

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

# 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”,这将转义非字母数字字符,如“&”。

这非常有效!你介意解释一下代码的哪一部分使它跳过所有现有的文件/目录吗?我在回答中添加了一些注释。基本上
%{REQUEST\u FILENAME}-f
表示如果它不是一个文件并且
%{REQUEST\u FILENAME}-d
表示如果请求不是为了目录。工作正常,感谢您的详细说明,我们将标记您的评论