Используйте mod_rewrite для перенаправления с example.com/dir на www.example.com/dir - PullRequest
4 голосов
/ 26 декабря 2010

Предположим, / является корнем документа моего домена example.com.

/.htaccess

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

/dir/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /dir/index.php [L]
</IfModule>

Я знаю, как перенаправить example.com/dir на www.example.com/dir, потому что /.htaccess делает всю работу.

Однако уловка в том, что я должен оставить /dir/.htaccess для обслуживания виртуальных каталогов (таких как /dir/state/AK/35827/, которые не являются действительными каталогами), если вы понимаете, о чем я.

Проблема в том, если я сохраню /dir/.htaccess, запрос:

http://example.com/dir/state/AK/35827/

НЕ перенаправляет на:

http://www.example.com/dir/state/AK/35827/

как бы:

http://example.com/

перенаправить на:

http://www.example.com/

Не уверен, если я ясно дал понять.

В принципе, как заставить http://example.com/dir/state/AK/35827/ правильно перенаправить на http://www.example.com/dir/state/AK/35827/ И я могу обслуживать виртуальные URL?

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

Если у вас есть доступ к конфигурации Apache VirtualHosts, вам нужно:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

Это успешно перенаправит http://example.com/ на http://www.example.com/ и http://example.com/dir/state/AK/35827/ на http://www.example.com/dir/state/AK/35827/

0 голосов
/ 07 января 2017

Проблема в том, что mod_rewrite не «наследует» родительский конфиг (.htaccess) по умолчанию.Директивы mod_rewrite в подкаталоге полностью переопределяют директивы mod_rewrite в родительском каталоге (в отличие от других модулей).

Вам необходимо:

  • Скопировать канонический редирект wwwиз родительского файла .htaccess в /dir/.htaccess.Но дублирование кода нежелательно.

  • ИЛИ: включить наследование mod_rewrite в дочернем файле .htaccess:

    RewriteOptions inherit
    

    Это эффективно «копирует» директивы mod_rewrite изродительский файл .htaccess.Однако, если у вас есть другие директивы, это может работать не так, как ожидалось.Обратите внимание, что это «копирует» директивы, не изменяя префикс каталога.

  • ИЛИ: делайте все в родительском файле .htaccess.Наличие одного .htaccess файла, вероятно, является предпочтительным решением.Например:

    RewriteEngine on
    
    # Canonical redirect
    RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
    RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
    
    # Virtual directories...
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^dir/ dir/index.php [L]
    
...