我的apache重写只适用于第一个文件夹级别

时间:2014-04-30 11:58:55

标签: regex apache .htaccess

我们有一个网站,向客户展示我们为他们制作的创意作品。我们将原始资产上传到这样的路径:

x.com/clients/clientName/campaignName/size/

我有一个PHP脚本,可以添加我们的品牌,联系信息和其他信息,并提取原始广告素材(通常是一个swf对象)。它位于此目录x.com/clients/index.php中,它接受查询字符串参数?path,因此它知道在哪里查找广告素材。

我正在尝试在.htaccess中进行apache重写,以便我们的设计人员可以直接上传到已知的文件夹结构,但是当你转到x.com/clients/clientName/campaignName/size/时,它应该重写为x.com/clients/index.php?path=clientName/campaignName/size/

我目前正在使用以下重写规则,该规则适用于第一个文件夹级别,例如: x.com/clients/clientName/成功重写,但任何后续文件夹都没有。

RewriteRule ^clients/([^/\.]+)/?$ /clients/index.php?path=$1 [L]

我的RegEx很糟糕,所以我不知所措。感谢任何帮助,谢天谢地。

2 个答案:

答案 0 :(得分:2)

您的正则表达式仅匹配clients/xxxxxx/等网址,因为您的模式[^/\.]+表示one or many characters except "/" or "."

根据您的规则,它不适用于其他子目录。

您可以通过此更改规则

RewriteRule ^clients/(.+)$ /clients/index.php?path=$1 [L]

为了避免内部服务器错误(在这种情况下代码500意味着无限循环),你可以这样做

RewriteRule ^clients/index\.php$ - [L]
RewriteRule ^clients/(.+)$ /clients/index.php?path=$1 [L]

答案 1 :(得分:1)

您是否有特殊原因要使用正则表达式?在我看来,你可以抓住/客户之后发生的一切:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^(.*/)?index\.php$ [NC]
RewriteRule ^clients/(.*)$ /clients/index.php?path=$1 [L]

第二行是为了防止重定向循环,因为index.php也在文件夹/ clients中,这会导致永不停止的重定向。