web-dev-qa-db-fra.com

Le sous-dossier ne sera pas redirigé en permanence vers un sous-domaine

À l’heure actuelle, j’ai le code suivant pour rediriger toutes les URL autres que www vers des URL www:

RewriteCond %{HTTP_Host} ^example.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Outre cette redirection, je souhaite également rediriger tous les appels vers/dev/to dev.example.com. J'ai essayé différentes approches mais rien n'a fonctionné (les rares qui se rapprochent comme ReplaceMatch ne redirigeront que vers le bit dev.example.com et laisseront le reste sous la forme d'une chaîne de requête).

Des idées?

EDIT: Voici le .htaccess complet pour le dossier racine (quelques réécrit pour des raisons de confidentialité):

ErrorDocument 404 /404.html
AddType application/x-httpd-php .json
AddType application/x-httpd-php .xml

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

# disables image hotlinking
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?example\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !google\. [NC] 
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]

# Stop htaccess rules from accessing these areas of the website.
RewriteRule ^(banner|boxart|cgi-bin|content|forums|includes|newsimages|newsimg|sidebar|union-files|google5e645385256c3a63.html) - [L]

# Redirects /page URLs to /page/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.[^./]+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) /$1/ [R=301,L]

# Redirect old URLs to their new URLs
RewriteRule ^reviews/badurl--43.html$ http://www.gamingunion.net/reviews/goodurl--43.html [R=301,NC]

# Redirect non-WWW to WWW
RewriteCond %{HTTP_Host} ^example.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
RedirectMatch 301 ^/dev/(.*)$ http://dev.example.com/$1

# URL Directory Redirects
RewriteRule ^([^/]*)/$ /index.php?p=$1&urltype=slash [L,QSA]
RewriteRule ^([^/]*)/$ /index.php?p=$1&urltype=slash [L,QSA]
RewriteRule ^([^/]*)/([^/]*)/$ /index.php?p=$1&lv1d=$2 [L,QSA]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/$ /index.php?p=$1&lv1d=$2&lv2d=$3 [L,QSA]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /index.php?p=$1&lv1d=$2&lv2d=$3&lv3d=$4 [L,QSA]

# URL File Redirects
RewriteRule ^([^/]*)\.html$ /index.php?p=$1&urltype=dot [L,QSA]
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?p=$1&lv1p=$2 [L,QSA]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ /index.php?p=$1&lv1d=$2&lv2p=$3 [L,QSA]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)\.html$ /index.php?p=$1&lv1d=$2&lv2d=$3&lv3p=$4 [L,QSA]

# For servers that support output compression, you should pick up a bit of speed but un-commenting the following lines.
php_flag zlib.output_compression On
php_value zlib.output_compression_level 5

Celui de/dev/est fondamentalement le même que celui-ci, à la différence qu’il a un bit de protection par mot de passe en haut et quelques redirections pour certains dossiers d’image résidant uniquement à la racine du serveur.

4
Shawn Collier

Donc .. vous avez plus d'un fichier .htaccess: un dans le dossier racine et un dans le dossier /dev.

Où avez-vous mis les règles de @Alex - root ou/dev .htaccess? Très probablement en racine. C'est la raison pour laquelle cela n'a pas fonctionné.

Le problème est que si Apache voit les règles de réécriture dans le dossier de niveau inférieur, il ne les exécutera PAS à partir du dossier parent, SAUF SI votre niveau inférieur .htaccess a RewriteOptions inherit ligne: http: //httpd.Apache .org/docs/current/mod/mod_rewrite.html # rewriteoptions

Maintenant, vous avez ajouté le code ci-dessous dans le fichier .htaccess:

RedirectMatch 301 ^/dev/(.*)$ http://dev.example.com/$1

Cette directive appartient à un autre module et est exécutée malgré tout .. et elle s'exécute après que mod_rewrite a déjà réécrit l'URL. C'est pourquoi vous voyez de vraies URL après la redirection.

La règle ci-dessous devrait fonctionner - insérez-la simplement dans votre /dev/.htaccess

RewriteCond %{HTTP_Host} !^dev\.example\.com
RewriteCond %{REQUEST_URI} ^/dev/
RewriteRule ^(.*)$ http://dev.example.com/$1 [R=301,L,QSA]

Il demande à Apache de rediriger si:

  • domaine n'est pas dev.example.com
  • L'URL commence par /dev/ (ce qui ne se produira que si le domaine principal le demande)
7
LazyOne

Essaye ça:

RewriteCond %{HTTP_Host} ^(www\.)?example\.com$
RewriteRule ^dev/(.*) http://dev.example.com/$1 [R=301,L]
1
Alex

J'ai utilisé le code de redirection suivant pour réécrire tous les sous-domaines en un paramètre d'URL:

# rewrite subdomain
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_Host} ^([^\.]+)\.example\.org$ [NC]
RewriteRule ^(.*)$ index.php?q=116&company_name=%1$1 [L,QSA,NC]

%1 est la correspondance regex pour le sous-domaine; $1 est constitué de tous les autres paramètres d'URL;

Jouez avec, pour rediriger vers un dossier, comme:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_Host} ^([^\.]+)\.example\.org$ [NC]
RewriteRule ^(.*)$ /%1/$1 [L,QSA,NC]
0
feeela