Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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

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
Apache .htaccess替换为“?”&;|=&引用;加上_&引用;在查询字符串中_Apache_.htaccess_Mod Rewrite_Url Rewriting_Query String - Fatal编程技术网

Apache .htaccess替换为“?”&;|=&引用;加上_&引用;在查询字符串中

Apache .htaccess替换为“?”&;|=&引用;加上_&引用;在查询字符串中,apache,.htaccess,mod-rewrite,url-rewriting,query-string,Apache,.htaccess,Mod Rewrite,Url Rewriting,Query String,我正在尝试为“按需”PHP图像大小调整器创建一个缓存系统 我需要能够检查缓存中是否存在以下文件和查询字符串: https://www.example.com/images/img.jpg?w=400&h=300&fit=crop 我的PHP脚本通过用下划线替换所有特殊字符(?,&,=)来生成缓存文件。 这就是缓存对象的外观: /cache/images/img.jpg_w_400_h_300_fit_crop 如何检查requst+查询是否作为文件存在于/cache中,如果存在,如何提供服务 我

我正在尝试为“按需”PHP图像大小调整器创建一个缓存系统

我需要能够检查缓存中是否存在以下文件和查询字符串:

https://www.example.com/images/img.jpg?w=400&h=300&fit=crop

我的PHP脚本通过用下划线替换所有特殊字符(?,&,=)来生成缓存文件。 这就是缓存对象的外观:
/cache/images/img.jpg_w_400_h_300_fit_crop

如何检查requst+查询是否作为文件存在于
/cache
中,如果存在,如何提供服务

我目前拥有的适用于没有查询变量的文件的功能如下:

# if file exists in /cache/ directory
# serve file from /cache/ directory
RewriteCond  %{DOCUMENT_ROOT}/cache/$1 -f
RewriteRule ^(.*)$ /cache/$1 [L,QSA]
我尝试过类似的东西,但它不起作用,因为我在htaccess/regex方面很差劲:)


有了你们展示的样品,你们能试一下下面的吗。请确保在测试URL之前清除浏览器缓存

RewriteEngine ON
##Rules for URL like: https://www.example.com/images/img.jpg?w=400&h=300&fit=crop
RewriteCond %{THE_REQUEST} \s/(?:[^?]*)\?([^=]*)=([^&]*)&([^=]*)=([^&]*)&([^=]*)=(.*)\s
RewriteCond %{DOCUMENT_ROOT}/cache/$1_%1_%2_%3_%4_%5_%6 -f
RewriteRule ^(.*)$ /cache/$1?%1_%2_%3_%4_%5_%6 [L]
我的PHP脚本通过用下划线替换所有特殊字符(?,&,=)来生成缓存文件

您可以在
.htaccess
中执行相同的操作。然后,这将处理URL参数中的“任意数量”1(因为您已经在注释中声明这是可变的)

请在
.htaccess
文件顶部附近尝试以下脚本。理想情况下,由于搜索/替换循环的递归性质,这需要接近顶部

# 1. Create env var for the image cache filename (IMAGE_CACHE_FN)
RewriteCond %{ENV:IMAGE_CACHE_FN} ^$
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^images/[\w-]+\.jpg$ - [E=IMAGE_CACHE_FN:cache/$0_%1]

# 2. Recursively replace "=" and "&" in IMAGE_CACHE_FN with "_"
RewriteCond %{ENV:IMAGE_CACHE_FN} ^(.*)[=&](.*)$
RewriteRule ^ - [E=IMAGE_CACHE_FN:%1_%2,N=50]

# 3. Test if image cache file exists and rewrite if so
RewriteCond %{ENV:IMAGE_CACHE_FN} .
RewriteCond %{DOCUMENT_ROOT}/%{ENV:IMAGE_CACHE_FN} -f
RewriteRule ^ %{ENV:IMAGE_CACHE_FN} [L]
我选择使用一个环境变量
IMAGE\u CACHE\u FN
来保存图像缓存文件名的值,而不是修改查询字符串或URL路径,因为我希望您稍后在PHP脚本中可能会使用它们

1在上面的脚本中,我将其限制为最多50个递归“循环”(相当于大约26个URL参数)。这由第二条重写规则上的
N=50
标志标识

一个潜在的警告是,如果URL参数以不同的顺序提供,那么对于本质上相同的资源,您自然会得到不同的缓存文件名。尽管这同样适用于您的PHP脚本,除非您首先对参数进行排序?(但是,除非重定向请求,否则可能会出现重复图像和缓存问题。)我假设您是按特定顺序提供URL参数的

您可以潜在地在
.htaccess
中对URL参数进行排序,但它可能会变得很麻烦


应该是
RewriteCond%{DOCUMENT\u ROOT}/cache/$1\u%1\u%2\u%3\u%4\u%5\u%6-f
并且它确实有效,但是我担心这仅适用于该设置。如果变量多了还是少了呢?有没有办法让它自动而不是列出%1_%2…%6?@Miro,谢谢你纠正了文档根规则。对于你们的问题,若变量或多或少,那个么最好的方法就是用任何可能的方法获取查询字符串,在单独的规则中捕获它们,因为捕获的内容的数量会发生变化,你们可以让我知道不同类型的查询字符串示例,然后我可以根据这些添加规则,干杯。
应该是
重写规则
替换字符串中的
(以匹配前面的文件系统检查)。(作为“整理”,您还可以删除带有
QSD
标志的查询字符串。)++ve获得非常好的代码,感谢您共享cheersBrilliant解决方案。也学到了新的东西。我现在不担心params的订单。另一种方法是使用PHP为所有文件提供服务,但我怀疑file_get_内容要比apache重写现有文件慢得多。
# 1. Create env var for the image cache filename (IMAGE_CACHE_FN)
RewriteCond %{ENV:IMAGE_CACHE_FN} ^$
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^images/[\w-]+\.jpg$ - [E=IMAGE_CACHE_FN:cache/$0_%1]

# 2. Recursively replace "=" and "&" in IMAGE_CACHE_FN with "_"
RewriteCond %{ENV:IMAGE_CACHE_FN} ^(.*)[=&](.*)$
RewriteRule ^ - [E=IMAGE_CACHE_FN:%1_%2,N=50]

# 3. Test if image cache file exists and rewrite if so
RewriteCond %{ENV:IMAGE_CACHE_FN} .
RewriteCond %{DOCUMENT_ROOT}/%{ENV:IMAGE_CACHE_FN} -f
RewriteRule ^ %{ENV:IMAGE_CACHE_FN} [L]