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 将/500/重定向到现有的最高目录<=500_Apache_.htaccess - Fatal编程技术网

Apache 将/500/重定向到现有的最高目录<=500

Apache 将/500/重定向到现有的最高目录<=500,apache,.htaccess,Apache,.htaccess,我是否可以以某种方式将所有请求重定向到给定目录中的任何现有目录mod_rewrite无法计算,而mod_alias(带有redirect和RedirectMatch)可以做得更少。您可以使用rewritemap进行mod_rewrite欺骗,但这将是相当低效的,或者每次添加新目录时都需要重新制作映射,apache需要重新启动。那太傻了 我建议改为使用脚本。我们使用mod_rewrite测试目录/文件是否存在,如果不存在,则重写为脚本 RewriteCond %{REQUEST_FILENAME}

我是否可以以某种方式将所有请求重定向到给定目录中的任何现有目录mod_rewrite无法计算,而mod_alias(带有
redirect
RedirectMatch
)可以做得更少。您可以使用rewritemap进行mod_rewrite欺骗,但这将是相当低效的,或者每次添加新目录时都需要重新制作映射,apache需要重新启动。那太傻了

我建议改为使用脚本。我们使用mod_rewrite测试目录/文件是否存在,如果不存在,则重写为脚本

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^[0-9]{3}/ router.php
在router.php中使用类似的内容

<?php
  $num = getNumberFromUrl( $_SERVER['REQUEST_URI'] );
  while( $num > 0 && !file_exists( "{$num}/" ) {
    $num--;
  }

  if( $num > 0 ) {
    header( "Location: " . replaceNumInUrl( $_SERVER['REQUEST_URI'], $num ), 302 );
  }
?>

是的,这是一个相当简单且复杂度较低的解决方案。如果目录结构不经常更改,则可以考虑将它们存储在脚本可以读取/包含的数组中,而不是在每个请求上使用文件系统进行检查。(手动(?)缓存失效和重新创建该数据数组的方法必须实现。)PHP是一个简单的解决方案,但速度相当慢。这就是为什么我在寻找更快的东西。如果我不愿意,我就用你的主意。谢谢我认为,这种缓慢的主要原因是测试文件系统中的许多目录。除非你有更好的方法知道存在哪些目录,否则我认为你找不到比这个更快的了。