Перенаправление Apache: предварительно ожидать 'www' и Чистые URL

Я управляю веб-сервером Apache/2.2.15 с несколькими виртуальными хостами. Для одного из этих хостов я хочу всегда предварительно ожидать отсутствие www.. Помимо этого, я хочу добавить несколько URL ярлыка. Вот то, что я сделал до сих пор:

RewriteEngine On
Redirect /short /some-long-URL
RewriteCond %{HTTP_HOST} ^my-domain\.org$ [NC]
RewriteRule ^.*$ http://www.%{SERVER_NAME}$1 [R=301]

С этими правилами, получая доступ к URL формы http://my-domain.org/some-URL переписывается и перенаправляется к http://www.my-domain.org/some-URL, который является точно, что я хочу. Однако при доступе http://my-domain.org/short, Я перенаправляюсь к http://www.my-domain.org/. Это походит на правило Перенаправления для /short никогда не применяется... Но доступ http://www.my-domain.org/short правильно перенаправляется к http://www.my-domain.org/some-long-URL.

Я надеюсь, что кто-то знает решение и может объяснить мне, что я делаю неправильно.

С уважением, Immanuel

PS: Я также ценил бы его, если решение будет также работать с RewriteRule с PassThrough вместо перенаправления :)

0
задан 29 November 2014 в 18:23
2 ответа

Переписать изменение домена

Отказ в правиле перезаписи до rewrite example.com → www.example.com :

 RewriteCond %{HTTP_HOST} !^www\. [NC]
 RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Как упоминал BillThor, http можно заменить на % {REQUEST_SCHEME} , чтобы не зависеть от схемы.

Что не так с правилами в вопросе?

Надеюсь, кто-то знает решение и может мне объяснить , что я делаю неправильно.

Это правило перезаписи:

RewriteRule ^.*$ http://www.%{SERVER_NAME}$1 [R=301]

Не имеет группы захвата, поэтому $ 1 - пустая строка.

0
ответ дан 5 December 2019 в 13:01

Я бы определил виртуальный host, чтобы указать желаемый домен в качестве имени сервера.

# Virtual host definition with desire canonical name
ServerName      www.example.com
ServerAlias     example.com
Use CanonicalName on

Вы можете использовать правило сквозной передачи, чтобы избежать перенаправления. Это невидимо для клиента (браузера). Есть несколько способов перенаправить запрос. Я показал два.

RewriteEngine On
RewriteBase /

# Handle rewrite without redirect (passthrough) 
RewriteRule /short /some-long-URL [PT]

# Or use a redirect (scheme and server not required as of 2.2.6)
Redirect /short http://%{SERVER_NAME}/some-long-URL

# Or use rewrite and redirect  
Rewrite ^/short some-long-URL [R]

Если вы используете канонические имена, вы можете просто перенаправить несовпадающие хосты.

RewriteCond %{HTTP_HOST} !^%{SERVER_NAME}$ [NC]
RewriteRule ^(.*)$ http://%{SERVER_NAME}/$1 [L,R=301]

Я обычно использую имена хостов вместо% {SERVER_NAME}. Если вы используете одну и ту же конфигурацию для HTTP и HTTPS, вы можете использовать% {REQUEST_SCHEME} вместо http в URL-адресах

0
ответ дан 5 December 2019 в 13:01

Теги

Похожие вопросы