Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用目录的第一个字母的Simple regex.htaccess_Regex_.htaccess_Mod Rewrite - Fatal编程技术网

使用目录的第一个字母的Simple regex.htaccess

使用目录的第一个字母的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

我需要一个简单的访问规则。我只是看到了,但不适合我

例如,我有以下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_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
。如果这是可行的,那么就是那条被移除的线失败了。如果它不起作用,第一个重写第二个就是问题。谢谢你,亚当,但它不起作用。我删除了第二次重写,但总是转到其他目录。有什么想法吗?非常感谢你的帮助