我在重定向通配符子域和处理内部 URL 缩短器时遇到问题。
假设我的应用中有一个内部 URL 缩短器
example.com/b/ABCDE
那将翻译
example.com/book/12345678-the-book-name
引用的脚本/b/
(我使用可以处理 URL 规则的 PHP 框架)会将短 IDABCDE
转换为书的真实 ID 12345678
(以及标题“书名”),然后将其重定向到书的永久 URLexample.com/book/12345678-the-book-name
因此,每次我在公告板、微博网站或海报或名片等物理媒体上传播有关书籍的链接时,我都会使用短链接 (the example.com/b/ABCDE
) 而不是永久链接 ( example.com/book/12345678-the-book-name
)。
www.example.com
接下来,我需要在维护请求 URI 的同时将所有通配符子域重定向到主域 ( ),例如
http://random.example.com/book/11111111-some-book -> http://www.example.com/book/11111111-some-book
http://123456.example.com/book/22222222-another-book -> http://www.example.com/book/22222222-another-book
http://abcdefg.example.com/book/33333333-another-book-again -> http://www.example.com/book/33333333-another-book-again
在我使用的所有规则之后添加以下规则
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.example.com [NC]
RewriteRule ^/(.*)$ http://www.example.com/$1 [R=301]
</VirtualHost>
因此,带有 example.com 域且没有前缀的 url 如下所示
http://example.com/book/11111111-some-book
将转化为
http://www.example.com/book/11111111-some-book
而且,另一个后果是,如果内部 URL 缩短器使用没有前缀的普通域,则需要两次重定向才能解析。例如,
http://example.com/b/ABCDE
将首先被重定向到
http://www.example.com/b/ABCDE
然后被重定向到
http://www.example.com/book/12345678-the-book-name
实际上,我不介意两次重定向。但是我的 SEO 顾问说两次重定向对我网站的 SEO 不利。(我仍然不知道为什么)
所以我尝试将最后一条规则更改为以下
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteCond %{REQUEST_URI} ^/b/(.*)$
RewriteRule . index.php [L]
RewriteCond %{HTTP_HOST} !^www.example.com [NC]
RewriteRule ^/(.*)$ http://www.example.com/$1 [R=301]
</VirtualHost>
我不太擅长配置 Apache,但是当我在http://htaccess.madewithlove.be/中模拟上述规则时,它可以工作。但是当我将它应用到我的服务器时,它给了我400 Bad Request的example.com/p/ABCDE
.
所以,我的问题是
- 我的 SEO 顾问对他的论点是否正确?是否有任何解释可以支持他或是否有相反的论点?
- 为什么服务器给出400 Bad Request?
- 如何修复重定向?我想维护短 URL(
example.com/b/ABCDE
不带www
前缀),但仍处于一个重定向中。