当我只想要基本名称时,RegEx捕获文件扩展名

时间:2013-06-08 22:35:38

标签: regex apache mod-rewrite

我在Mod-Rewrite命令中使用以下RegEx,但不希望捕获的$ 1变量包含.html扩展名。

RewriteRule ^photo-search\/([^/]+)(/|\.html|)$ http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all [H=cgi-script]  

此命令与以下URL的用途完全相同 重写http://www.artminds.com/photo-search/outdoors以捕获“户外”并正确地将“户外”一词发送到我的重写代码中的变量。 http://www.artminds.com/photo-search/outdoors/也只捕获“outdoors”这个单词,并在我的重写代码中插入没有尾部斜杠的单词。

但如果有人输入/photo-search/outdoors.html,文件扩展名.html会包含在重写代码中,这会触发软404,因为outdoors.html正在传递给cgi脚本,当然它找不到以.html结尾的关键字。

我尝试了各种选项,但我的错误日志显示文件未找到或仅仅通过“照片搜索”,而不是“照片搜索”之后的部分。

提前致谢。

艺术思想 帕萨迪纳,加利福尼亚州

2 个答案:

答案 0 :(得分:1)

一个解决方法是让[^/]+部分非贪婪,这样只要整个正则表达式仍然匹配,它就会尽可能少地匹配。这样,它就不会包含.html(因为.html可以与正则表达式的后续部分匹配)。为此,请使用+?代替+

RewriteRule ^photo-search\/([^/]+?)(/|\.html|)$ http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all [H=cgi-script]

但是,我想知道您是否真的希望将此规则应用于以(例如).jpg结尾的网址?如果没有,那么更好的解决方法可能是在.部分不允许匹配的字符列表中包含[^/]+

RewriteRule ^photo-search\/([^/.]+)(/|\.html|)$ http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all [H=cgi-script]

答案 1 :(得分:1)

尝试

 RewriteRule ^photo-search\/([^/\.]+)(/|\.html|)$
 http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all
 [H=cgi-script]

您的$ 1参数与第一个组匹配(在()之间)但由于该组的正则表达式表示除了/它之外的任何字符也会抓取.html。通过告诉它不接受。它只接受没有扩展名的字符串。