使用目录的第一个字母的Simple regex.htaccess
我需要一个简单的访问规则。我只是看到了,但不适合我 例如,我有以下url:使用目录的第一个字母的Simple regex.htaccess,regex,.htaccess,mod-rewrite,Regex,.htaccess,Mod Rewrite,我需要一个简单的访问规则。我只是看到了,但不适合我 例如,我有以下url: http://img.myp.local/thumbs/640x700/Birra/nba_jordan_chicago.jpg /cache/Birra/B/nba_jordan_chicago640x700 我需要解析此url: http://img.myp.local/thumbs/640x700/Birra/nba_jordan_chicago.jpg /cache/Birra/B/nba_jordan_c
http://img.myp.local/thumbs/640x700/Birra/nba_jordan_chicago.jpg
/cache/Birra/B/nba_jordan_chicago640x700
我需要解析此url:
http://img.myp.local/thumbs/640x700/Birra/nba_jordan_chicago.jpg
/cache/Birra/B/nba_jordan_chicago640x700
你可以在那里找到:
1. /cache/
2. third directory
3. first letter of third directory
4. name of the file (without .jpg)
5. second directory
当时我写了这样一条规则:
RewriteEngine on
RewriteRule ^(.*)/([^/]+)/([^/]+).jpg?$ /cache/$2/${lc:$2}/$3$1 [L]
结果是/cache/Birra//nba_jordan_18640x700
,您可以看到第三个目录的第一个字母缺失
谢谢你的帮助,
斯特凡诺
编辑1
亚当的解决方案非常有效!但我还有一个问题
如果结果/cache/Birra/B/nba\u jordan\u chicago640x700
不存在,我可以获取另一个url吗?例如,/OTHER_DIRECTORY/640x700/Birra/nba_jordan_chicago.jpg
格拉齐
编辑2
伙计们,这是具有回退功能的解决方案:
RewriteCond %{DOCUMENT_ROOT}/cache/$2/$3/$4$1 -f
RewriteRule ^(.*)/(([^/])[^/]*)/([^/]+).jpg?$ /cache/$2/$3/$4$1 [L]
RewriteCond %{DOCUMENT_ROOT}/cache/$2/$3/$4$1 !-f
RewriteRule ^(.*)/(([^/])[^/]*)/([^/]+).jpg?$ /thumbs/$1/$2/$4.jpg [L]
再次感谢你的帮助
编辑3
@亚当:这对我很有用:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/cache/$2/$3/$4$1 -f
RewriteRule ^(.*)/(([^/])[^/]*)/([^/]+).jpg?$ /cache/$2/$3/$4$1 [L]
RewriteCond %{DOCUMENT_ROOT}/cache/$2/$3/$4$1 !-f
RewriteRule ^(.*)/(([^/])[^/]*)/([^/]+).jpg?$ /thumbs/$1/$2/$4.jpg [L]
</IfModule>
重新启动发动机
重写cond%{DOCUMENT_ROOT}/cache/$2/$3/$4$1-f
重写规则^(.*)/([^/])[^/]*)/([^/]+).jpg?$/cache/$2/$3/$4$1[L]
重写cond%{DOCUMENT_ROOT}/cache/$2/$3/$4$1-F
重写规则^(.*)/([^/])[^/]*)/([^/]+).jpg?$/thumbs/$1/$2/$4.jpg[L]
这将捕获单词中的第一个字母,以便可以使用两次:
RewriteEngine on
RewriteRule ^(.*)/(([^/])[^/]*)/([^/]+).jpg?$ /cache/$2/$3/$4$1 [L]
如果要在该文件不存在的情况下进行回退,可以与-f
:
RewriteEngine on
RewriteCond %{REQUEST_URI} ^(.*)/(([^/])[^/]*)/([^/]+).jpg?$
RewriteCond %{DOCUMENT_ROOT}/cache/%2/%3/%4%1 -f
RewriteRule /cache/%2/%3/%4%1 [L]
RewriteRule ^(.*)/(([^/])[^/]*)/([^/]+).jpg?$ /OTHER_DIRECTORY/$2/$3/$4$1 [L]
只有当存在这样一个文件时,才会转到
/cache
位置,否则会转到/OTHER\u目录
。我生锈了;我已经多年没有做过这类事情了,目前我缺少一个Apache httpd实例来进行实验,但这应该非常接近。这可能更好,因为它特别忽略了第一个路径组件,并在末尾添加了一个与文字“.”匹配的字符(而不是任何字符):
^ # beginning of string
/ # literal '/'
[^/]+? # one or more chars except '/' - non-greedy
/ # literal '/'
( # start capture group 1
[^/]+? # one or more chars except '/' - non-greedy
) # end capture group 1
/ # literal '/'
( # start capture group 2
( # start capture group 3
. # first character
) # end capture group 3
[^/]+? # one or more chars except '/' - non-greedy
) # end capture group 2
/ # literal '/'
( # start capture group 4
.+? # one or more chars - non-greedy
) # end capture group 4
\. # literal '.'
jpg # literal 'jpg'
$ # end of string
因此:
我想正则表达式需要一些调整:
RewriteEngine on
RewriteRule ^([^/]*?)/([^/]*)/([^/])([^/]*)/([^/]+)\.jpg?$ /cache/$3$4/$3/$5$2 [L]
输入:http://img.myp.local/thumbs/640x700/Birra/nba_jordan_chicago.jpg
输出:http://img.myp.local/cache/Birra/B/nba_jordan_chicago640x700
测试日期。@adam katz:谢谢!这是完美的工作!你太棒了!编辑2解决方案是如何工作的?
RewriteCond
匹配与任何内容都不对应……您好@AdamKatz,请查看上面(编辑3)对于非贪婪匹配使用“[^/]+”和“?”可能表面上看起来没有必要,但实际上它为正则表达式引擎提供了有用的提示,这将有助于提高性能。Hm。如果您总是使用诸如“/thumbs/640x700/Birra/nba_jordan_chicago.jpg”这样的路径,其中路径始终有四个部分(即['thumbs'、'640x700'、'Birra'、'nba_jordan_chicago.jpg'),那么它将起作用。如果路径的四个部分以上,则不会。此外,以前的解决方案也将匹配“/foo/bar/baz/thumbs/640x700/Birra/nba_jordan_chicagoXjpg”,这可能不是您想要的。谢谢Rob。现在清楚了。对另一个问题有什么想法吗?GrazieI不建议在不必要时使用懒惰的评估者。它们很贵,真奇怪。这是madewithlove的作品,但是它不适合我的apacheAdam,还有其他问题吗?(我编辑了第一个问题)。感谢you@user2568539,我已经回答了你的另一个问题,尽管我还没有测试我的答案。让我知道它是怎么工作的。谢谢你,亚当,但它不工作。我的意思是:如果/cache/文件存在,它也总是转到其他目录。有什么想法吗?对不起,没有我自己的ApacheHTTPD,我无法有效地解决这个问题。不使用第二个RewriteCond
来尝试它,它应该总是转到/cache
。如果这是可行的,那么就是那条被移除的线失败了。如果它不起作用,第一个重写第二个就是问题。谢谢你,亚当,但它不起作用。我删除了第二次重写,但总是转到其他目录。有什么想法吗?非常感谢你的帮助