Apache 重定向:在 URL 前面添加“www”并清理 URL

Apache 重定向:在 URL 前面添加“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]

使用这些规则,访问 表单的 URLhttp://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

我希望有人知道解决方案并能向我解释我做错了什么。

问候,伊曼纽尔

PS:如果解决方案也可以使用 RewriteRule 和 PassThrough 而不是重定向,我将不胜感激:)

答案1

重写更改域

重写规则下降到重写 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 是一个空字符串。

答案2

我将定义虚拟主机以将所需的域作为其服务器名称。

# 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 使用相同的配置,则可能需要http在 URL 中使用 %{REQUEST_SCHEME} 而不是

相关内容