Regex 当我只需要基本名称时,正则表达式捕获文件扩展名

Regex 当我只需要基本名称时,正则表达式捕获文件扩展名,regex,apache,mod-rewrite,Regex,Apache,Mod Rewrite,我在Mod Rewrite命令中使用以下正则表达式,但不希望$1变量包含.html扩展名 RewriteRule ^photo-search\/([^/]+)(/|\.html|)$ http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all [H=cgi-script] 此命令的工作方式与以下URL的工作方式完全相同 重写以捕获“outdoors”,并正确地将单词“outdoors

我在Mod Rewrite命令中使用以下正则表达式,但不希望$1变量包含.html扩展名

RewriteRule ^photo-search\/([^/]+)(/|\.html|)$ http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all [H=cgi-script]  
此命令的工作方式与以下URL的工作方式完全相同
重写以捕获“outdoors”,并正确地将单词“outdoors”发送到我的重写代码中的变量n。 还捕获了单词“outdoors”,并在我的重写代码中插入它而不带尾随斜杠

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

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

提前谢谢

艺术头脑

加利福尼亚州帕萨迪纳

一个修复方法是使
[^/]+
部分不贪婪,这样只要正则表达式作为一个整体仍然匹配,它就会尽可能少地匹配。这样,它就不包括
.html
(因为
.html
可以由正则表达式的后面部分匹配)。为此,请使用
+?
而不是
+

RewriteRule ^photo-search\/([^/]+?)(/|\.html|)$ http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all [H=cgi-script]
但是,我想知道您是否真的希望将此规则应用于以(比如)
.jpg
结尾的URL?如果没有,那么更好的修复方法可能是在
[^/]+
部分不允许匹配的字符列表中包含

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


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

非常感谢。除非没有尾随斜杠,否则第一个选项有效。但是,我修改了它,添加了额外的“|”或选项如下:感谢@ruakh提供的解决方案。它现在工作得很好。我不认为第二个选项可能需要.jpg扩展名,但是排除字符列表中的
是否需要前面加\来指示其文字值,而不是特殊字符
?现在,您知道如何让浏览器继续显示修改后的URL而不是显示重写URL吗?@ArtMinds:Re:“排除字符列表中的
是否需要前面加\以指示其文字值,而不是特殊字符
”:否,因为
在字符类中并不特殊。例如,regex
3[.]4
,相当于regex
3\.4
。Re:“您知道如何让浏览器继续显示修改后的URL而不是显示重写URL吗?”:要执行实际的HTTP重定向,而不仅仅是在内部进行转换,请将
[H=cgi脚本]
更改为
[R]
。谢谢@ruakh我刚刚尝试将
[H=cgi脚本]
更改为
[R]
但结果相同,显示的是重定向的URL,而不是我在浏览器地址栏中键入的URL。我的.htaccess文件以以下内容开头:
Options+FollowSymLinks
RewriteEngine on
是否需要通过使用
[R]
来实现这一点?@ArtMinds:Re:“但结果相同,显示的是重定向的URL,而不是我在浏览器地址栏中键入的URL”:抱歉,更改为
[R]
是获得重定向URL的方式——我想你想要的是相反的方式。好吧,你写的规则不应该导致重定向。您是否有可能使用不同的规则导致重定向?比如,你还有其他的
重写规则吗?谢谢@Glenn Vandamme的帮助。您的解决方案与下面的解决方案一样有效。我还会问您是否知道如何让浏览器显示输入的URL,而不显示生成页面的重写?
RewriteRule ^photo-search\/([^/]+)(/|\.html|)$ http://www.artminds.com/cgi-bin/ImageFolio4/imageFolio.cgi\?search=$1&bool\=all [H=cgi-script]