Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

ApacheMatcherDumper.php

Zuletzt modifiziert: 09.10.2024, 12:59 - Dateigröße: 8.69 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of the Symfony package.
 005   *
 006   * (c) Fabien Potencier <fabien@symfony.com>
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  namespace Symfony\Component\Routing\Matcher\Dumper;
 013   
 014  use Symfony\Component\Routing\Route;
 015   
 016  /**
 017   * Dumps a set of Apache mod_rewrite rules.
 018   *
 019   * @author Fabien Potencier <fabien@symfony.com>
 020   * @author Kris Wallsmith <kris@symfony.com>
 021   */
 022  class ApacheMatcherDumper extends MatcherDumper
 023  {
 024      /**
 025       * Dumps a set of Apache mod_rewrite rules.
 026       *
 027       * Available options:
 028       *
 029       *  * script_name: The script name (app.php by default)
 030       *  * base_uri:    The base URI ("" by default)
 031       *
 032       * @param array $options An array of options
 033       *
 034       * @return string A string to be used as Apache rewrite rules
 035       *
 036       * @throws \LogicException When the route regex is invalid
 037       */
 038      public function dump(array $options = array())
 039      {
 040          $options = array_merge(array(
 041              'script_name' => 'app.php',
 042              'base_uri'    => '',
 043          ), $options);
 044   
 045          $options['script_name'] = self::escape($options['script_name'], ' ', '\\');
 046   
 047          $rules = array("# skip \"real\" requests\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteRule .* - [QSA,L]");
 048          $methodVars = array();
 049          $hostRegexUnique = 0;
 050          $prevHostRegex = '';
 051   
 052          foreach ($this->getRoutes()->all() as $name => $route) {
 053              $compiledRoute = $route->compile();
 054              $hostRegex = $compiledRoute->getHostRegex();
 055   
 056              if (null !== $hostRegex && $prevHostRegex !== $hostRegex) {
 057                  $prevHostRegex = $hostRegex;
 058                  $hostRegexUnique++;
 059   
 060                  $rule = array();
 061   
 062                  $regex = $this->regexToApacheRegex($hostRegex);
 063                  $regex = self::escape($regex, ' ', '\\');
 064   
 065                  $rule[] = sprintf('RewriteCond %%{HTTP:Host} %s', $regex);
 066   
 067                  $variables = array();
 068                  $variables[] = sprintf('E=__ROUTING_host_%s:1', $hostRegexUnique);
 069   
 070                  foreach ($compiledRoute->getHostVariables() as $i => $variable) {
 071                      $variables[] = sprintf('E=__ROUTING_host_%s_%s:%%%d', $hostRegexUnique, $variable, $i+1);
 072                  }
 073   
 074                  $variables = implode(',', $variables);
 075   
 076                  $rule[] = sprintf('RewriteRule .? - [%s]', $variables);
 077   
 078                  $rules[] = implode("\n", $rule);
 079              }
 080   
 081              $rules[] = $this->dumpRoute($name, $route, $options, $hostRegexUnique);
 082   
 083              if ($req = $route->getRequirement('_method')) {
 084                  $methods = explode('|', strtoupper($req));
 085                  $methodVars = array_merge($methodVars, $methods);
 086              }
 087          }
 088          if (0 < count($methodVars)) {
 089              $rule = array('# 405 Method Not Allowed');
 090              $methodVars = array_values(array_unique($methodVars));
 091              if (in_array('GET', $methodVars) && !in_array('HEAD', $methodVars)) {
 092                  $methodVars[] = 'HEAD';
 093              }
 094              foreach ($methodVars as $i => $methodVar) {
 095                  $rule[] = sprintf('RewriteCond %%{ENV:_ROUTING__allow_%s} =1%s', $methodVar, isset($methodVars[$i + 1]) ? ' [OR]' : '');
 096              }
 097              $rule[] = sprintf('RewriteRule .* %s [QSA,L]', $options['script_name']);
 098   
 099              $rules[] = implode("\n", $rule);
 100          }
 101   
 102          return implode("\n\n", $rules)."\n";
 103      }
 104   
 105      /**
 106       * Dumps a single route
 107       *
 108       * @param  string $name Route name
 109       * @param  Route  $route The route
 110       * @param  array  $options Options
 111       * @param  bool   $hostRegexUnique Unique identifier for the host regex
 112       *
 113       * @return string The compiled route
 114       */
 115      private function dumpRoute($name, $route, array $options, $hostRegexUnique)
 116      {
 117          $compiledRoute = $route->compile();
 118   
 119          // prepare the apache regex
 120          $regex = $this->regexToApacheRegex($compiledRoute->getRegex());
 121          $regex = '^'.self::escape(preg_quote($options['base_uri']).substr($regex, 1), ' ', '\\');
 122   
 123          $methods = $this->getRouteMethods($route);
 124   
 125          $hasTrailingSlash = (!$methods || in_array('HEAD', $methods)) && '/$' === substr($regex, -2) && '^/$' !== $regex;
 126   
 127          $variables = array('E=_ROUTING_route:'.$name);
 128          foreach ($compiledRoute->getHostVariables() as $variable) {
 129              $variables[] = sprintf('E=_ROUTING_param_%s:%%{ENV:__ROUTING_host_%s_%s}', $variable, $hostRegexUnique, $variable);
 130          }
 131          foreach ($compiledRoute->getPathVariables() as $i => $variable) {
 132              $variables[] = 'E=_ROUTING_param_'.$variable.':%'.($i + 1);
 133          }
 134          foreach ($this->normalizeValues($route->getDefaults()) as $key => $value) {
 135              $variables[] = 'E=_ROUTING_default_'.$key.':'.strtr($value, array(
 136                  ':'  => '\\:',
 137                  '='  => '\\=',
 138                  '\\' => '\\\\',
 139                  ' '  => '\\ ',
 140              ));
 141          }
 142          $variables = implode(',', $variables);
 143   
 144          $rule = array("# $name");
 145   
 146          // method mismatch
 147          if (0 < count($methods)) {
 148              $allow = array();
 149              foreach ($methods as $method) {
 150                  $allow[] = 'E=_ROUTING_allow_'.$method.':1';
 151              }
 152   
 153              if ($compiledRoute->getHostRegex()) {
 154                  $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
 155              }
 156   
 157              $rule[] = "RewriteCond %{REQUEST_URI} $regex";
 158              $rule[] = sprintf("RewriteCond %%{REQUEST_METHOD} !^(%s)$ [NC]", implode('|', $methods));
 159              $rule[] = sprintf('RewriteRule .* - [S=%d,%s]', $hasTrailingSlash ? 2 : 1, implode(',', $allow));
 160          }
 161   
 162          // redirect with trailing slash appended
 163          if ($hasTrailingSlash) {
 164              if ($compiledRoute->getHostRegex()) {
 165                  $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
 166              }
 167   
 168              $rule[] = 'RewriteCond %{REQUEST_URI} '.substr($regex, 0, -2).'$';
 169              $rule[] = 'RewriteRule .* $0/ [QSA,L,R=301]';
 170          }
 171   
 172          // the main rule
 173   
 174          if ($compiledRoute->getHostRegex()) {
 175              $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
 176          }
 177   
 178          $rule[] = "RewriteCond %{REQUEST_URI} $regex";
 179          $rule[] = "RewriteRule .* {$options['script_name']} [QSA,L,$variables]";
 180   
 181          return implode("\n", $rule);
 182      }
 183   
 184      /**
 185       * Returns methods allowed for a route
 186       *
 187       * @param Route  $route The route
 188       *
 189       * @return array The methods
 190       */
 191      private function getRouteMethods(Route $route)
 192      {
 193          $methods = array();
 194          if ($req = $route->getRequirement('_method')) {
 195              $methods = explode('|', strtoupper($req));
 196              // GET and HEAD are equivalent
 197              if (in_array('GET', $methods) && !in_array('HEAD', $methods)) {
 198                  $methods[] = 'HEAD';
 199              }
 200          }
 201   
 202          return $methods;
 203      }
 204   
 205      /**
 206       * Converts a regex to make it suitable for mod_rewrite
 207       *
 208       * @param string  $regex The regex
 209       *
 210       * @return string The converted regex
 211       */
 212      private function regexToApacheRegex($regex)
 213      {
 214          $regexPatternEnd = strrpos($regex, $regex[0]);
 215   
 216          return preg_replace('/\?P<.+?>/', '', substr($regex, 1, $regexPatternEnd - 1));
 217      }
 218   
 219      /**
 220       * Escapes a string.
 221       *
 222       * @param string $string The string to be escaped
 223       * @param string $char   The character to be escaped
 224       * @param string $with   The character to be used for escaping
 225       *
 226       * @return string The escaped string
 227       */
 228      private static function escape($string, $char, $with)
 229      {
 230          $escaped = false;
 231          $output = '';
 232          foreach (str_split($string) as $symbol) {
 233              if ($escaped) {
 234                  $output .= $symbol;
 235                  $escaped = false;
 236                  continue;
 237              }
 238              if ($symbol === $char) {
 239                  $output .= $with.$char;
 240                  continue;
 241              }
 242              if ($symbol === $with) {
 243                  $escaped = true;
 244              }
 245              $output .= $symbol;
 246          }
 247   
 248          return $output;
 249      }
 250   
 251      /**
 252       * Normalizes an array of values.
 253       *
 254       * @param array $values
 255       *
 256       * @return string[]
 257       */
 258      private function normalizeValues(array $values)
 259      {
 260          $normalizedValues = array();
 261          foreach ($values as $key => $value) {
 262              if (is_array($value)) {
 263                  foreach ($value as $index => $bit) {
 264                      $normalizedValues[sprintf('%s[%s]', $key, $index)] = $bit;
 265                  }
 266              } else {
 267                  $normalizedValues[$key] = (string) $value;
 268              }
 269          }
 270   
 271          return $normalizedValues;
 272      }
 273  }
 274