我在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结尾的关键字。
我尝试了各种选项,但我的错误日志显示文件未找到或仅仅通过“照片搜索”,而不是“照片搜索”之后的部分。
提前致谢。
艺术思想 帕萨迪纳,加利福尼亚州
答案 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。通过告诉它不接受。它只接受没有扩展名的字符串。