web-dev-qa-db-fra.com

Réécriture d'URL du sous-dossier en tant qu'utilisateur root et interdiction d'accès au sous-dossier

J'ai Drupal installé dans un sous-dossier drupal mais je souhaite accéder aux pages telles qu'elles se trouvent dans le dossier racine: http://www.example.com au lieu de http://www.example.com/drupal

Je peux avoir ce travail, mais cela fonctionne également avec l'URL contenant le sous-dossier, ainsi j'ai http://www.example.com et un site clone dans http://www.example.com/drupal.

Quelle est la règle pour interdire l'accès aux sous-dossiers?

Je veux que toutes les URL commençant par http://www.example.com/drupal soient interdites.

C'est . Htaccess dans le répertoire /:

Options -Indexes

Options +FollowSymLinks

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_Host} ^www\.(.+)$ [NC]
  RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]
  RewriteRule ^(.*+)$ drupal/$1 [L,QSA]
</IfModule>

Et ceci est Drupal . Htaccess dans le répertoire /drupal/:

Options -Indexes
Options +FollowSymLinks
ErrorDocument 404 index.php
DirectoryIndex index.php index.html index.htm

# Override PHP settings that cannot be changed at runtime. See
# sites/default/default.settings.php and drupal_initialize_variables() in
# includes/bootstrap.inc for settings that can be changed at runtime.

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
  php_flag magic_quotes_gpc                 off
  php_flag magic_quotes_sybase              off
  php_flag register_globals                 off
  php_flag session.auto_start               off
  php_value mbstring.http_input             pass
  php_value mbstring.http_output            pass
  php_flag mbstring.encoding_translation    off
</IfModule>

# Requires mod_expires to be enabled.
<IfModule mod_expires.c>
  # Enable expirations.
  ExpiresActive On

  # Cache all files for 2 weeks after access (A).
  ExpiresDefault A1209600

  <FilesMatch \.php$>
    # Do not allow PHP scripts to be cached unless they explicitly send cache
    # headers themselves. Otherwise all scripts would have to overwrite the
    # headers set by mod_expires if they want another caching behavior. This may
    # fail if an error occurs early in the bootstrap process, and it may cause
    # problems if a non-Drupal PHP file is installed in a subdirectory.
    ExpiresActive Off
  </FilesMatch>
</IfModule>

# Various rewrite rules.
<IfModule mod_rewrite.c>
  RewriteEngine on

  # Block access to "hidden" directories whose names begin with a period. This
  # includes directories used by version control systems such as Subversion or
  # Git to store control files. Files whose names begin with a period, as well
  # as the control files used by CVS, are protected by the FilesMatch directive
  # above.
  RewriteRule "(^|/)\." - [F]

  # To redirect all users to access the site WITH the 'www.' prefix,
  # (http://example.com/... will be redirected to http://www.example.com/...)
  # uncomment the following:
  # RewriteCond %{HTTP_Host} !^www\. [NC]
  # RewriteRule ^ http://www.%{HTTP_Host}%{REQUEST_URI} [L,R=301]
  #
  # To redirect all users to access the site WITHOUT the 'www.' prefix,
  # (http://www.example.com/... will be redirected to http://example.com/...)
  # uncomment the following:
  RewriteCond %{HTTP_Host} ^www\.(.+)$ [NC]
  RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]

  RewriteBase /drupal

  # Pass all requests not referring directly to files in the filesystem to
  # index.php. Clean URLs are handled in drupal_environment_initialize().
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  #RewriteRule ^ index.php [L]
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

  # Rules to correctly serve gzip compressed CSS and JS files.
  # Requires both mod_rewrite and mod_headers to be enabled.
  <IfModule mod_headers.c>
    # Serve gzip compressed CSS files if they exist and the client accepts gzip.
    RewriteCond %{HTTP:Accept-encoding} gzip
    RewriteCond %{REQUEST_FILENAME}\.gz -s
    RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

    # Serve gzip compressed JS files if they exist and the client accepts gzip.
    RewriteCond %{HTTP:Accept-encoding} gzip
    RewriteCond %{REQUEST_FILENAME}\.gz -s
    RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

    # Serve correct content types, and prevent mod_deflate double gzip.
    RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
    RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

    <FilesMatch "(\.js\.gz|\.css\.gz)$">
      # Serve correct encoding type.
      Header append Content-Encoding gzip
      # Force proxies to cache gzipped & non-gzipped css/js files separately.
      Header append Vary Accept-Encoding
    </FilesMatch>
  </IfModule>
</IfModule>
3
Alessandro Pezzato

Je pensais qu'il y aurait un moyen (par exemple, peut-être quelque chose à voir avec les sous-demandes) de déterminer si l'URI en cours de vérification provient d'une réécriture interne (d'une règle de réécriture précédente), mais il semble qu'il ne s'agisse pas de AFAICT. est venu avec vérifie la requête HTTP d'origine, ce qui a quelques inconvénients (ce n'est pas décodé d'URI), mais cela fonctionne pour des cas simples:

<IfModule mod_rewrite.c>
   RewriteEngine  on
   RewriteBase    /
   # Internally rewrite root URIs to /drupal
   RewriteRule    ^(?!drupal/)(.*)$ drupal/$1 [L]
   # Capture unrewritten requests that attempt to access /drupal
   RewriteCond    %{THE_REQUEST} ^(GET|POST)\ /drupal/
   # Return status code 403 Forbidden
   RewriteRule    ^drupal/.* - [F,L]
</IfModule>

Le modèle de correspondance pour la deuxième règle de réécriture est probablement redondant compte tenu de sa condition de réécriture.

1
Lèse majesté

Essayez ceci, ajoutez simplement RewriteRule ^drupal/(.*) - [F,L]:

Options -Indexes
Options +FollowSymLinks

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^drupal/(.*) - [F,L]
  RewriteCond %{HTTP_Host} ^www\.(.+)$ [NC]
  RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]
  RewriteRule ^(.*+)$ drupal/$1 [L,QSA]
</IfModule>

S'il vous plaît dites-moi si cela fonctionne.

0
Olivier Pons