Я управляю веб-сервером 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 вместо перенаправления :)
Отказ в правиле перезаписи до 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 - пустая строка.
Я бы определил виртуальный 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-адресах