1

我在 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/也只捕获了“户外”这个词,并在我的重写代码中插入它而没有尾部斜杠。

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

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

提前致谢。

艺术心灵
加州帕萨迪纳

4

2 回答 2

1

尝试

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

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

于 2013-06-08T22:47:05.417 回答
1

一种解决方法是使该[^/]+部分成为non-greedy,这样只要整个正则表达式仍然匹配,它就会倾向于尽可能少地匹配。这样,它就不会包括.html(因为.html可以与正则表达式的后面部分匹配)。为此,请使用+?代替+

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

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

RewriteRule ^photo-search\/([^/.]+)(/|\.html|)$ http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all [H=cgi-script]
于 2013-06-08T22:45:08.127 回答