Apache重写-重定向通配符子域并处理内部URL缩短器

Apache重写-重定向通配符子域并处理内部URL缩短器,apache,mod-rewrite,redirect,seo,Apache,Mod Rewrite,Redirect,Seo,我在重定向通配符子域和处理内部URL缩短器方面有问题 假设我的应用程序中有一个内部URL缩短器 example.com/b/ABCDE 这将转化为 example.com/book/12345678-the-book-name 由/b/引用的脚本(我使用可以处理URL规则的PHP框架)将短IDABCDE转换为图书真实ID12345678(以及标题“图书名称”),然后将其重定向到图书的永久URLexample.com/book/12345678图书名称 因此,每当我在诸如公告板、微博网站或海报

我在重定向通配符子域和处理内部URL缩短器方面有问题

假设我的应用程序中有一个内部URL缩短器

example.com/b/ABCDE
这将转化为

example.com/book/12345678-the-book-name
/b/
引用的脚本(我使用可以处理URL规则的PHP框架)将短ID
ABCDE
转换为图书真实ID
12345678
(以及标题“图书名称”),然后将其重定向到图书的永久URL
example.com/book/12345678图书名称

因此,每当我在诸如公告板、微博网站或海报或名片等实体媒体上传播关于一本书的链接时,我都会使用短链接(即
example.com/b/ABCDE
)而不是永久链接(
example.com/book/12345678书名

接下来,我需要将所有通配符子域重定向到主域(
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>
将转化为

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
然后将其重定向到

http://www.example.com/b/ABCDE
http://www.example.com/book/12345678-the-book-name
事实上,我不介意两次重定向。但我的搜索引擎优化顾问说,两次重定向对我的网站的搜索引擎优化是有害的。(我仍然不知道为什么)

所以我试着把最后一条规则改成下面的

<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>

ServerName example.com
ServerAlias*.example.com
重新启动发动机
RewriteCond%{HTTP_HOST}^example.com[NC]
重写条件%{REQUEST_URI}^/b/(.*)$
重写规则。index.php[L]
重写cond%{HTTP_HOST}^www.example.com[NC]
重写规则^/(.*)$http://www.example.com/$1[R=301]
我不太擅长配置Apache,但当我在中模拟上述规则时,它就工作了。但是当我把它应用到我的服务器上时,它给了我一个400个错误请求,请求
example.com/p/ABCDE

所以,我的问题是

  • 我的搜索引擎优化顾问的观点正确吗?是否有任何解释可以支持他,或者是否有相反的论点
  • 为什么服务器发出了400个错误请求
  • 如何修复重定向?我想维护短URL(
    example.com/b/ABCDE
    ,不带
    www
    前缀),但仍在一个重定向中
  • 你是SEO顾问吗? 正如所有SEO的事情一样,答案包括一些猜测和假设,但他可能是对的

    当您重定向页面时,您会告诉爬虫程序忘记初始页面,稍后再回来为目标页面编制索引,这会在首次向世界介绍页面和页面在搜索结果中的实际外观之间引入延迟。两次重定向意味着延迟增加一倍。根据搜索引擎的“情绪”,这可能会导致SEO的显著倒退(或者在搜索引擎对重定向进行排序时,索引URL出现一些混乱)

    为什么你得到400的回复 如果您查看文档中每个服务器配置的内部条目

    给定规则-->结果替换
    ^/somepath(.*)-->其他路径$1
    :无效,不受支持
    ^/somepath(.*)-->/otherpath$1
    /otherpath/pathinfo

    这意味着,在vhost conf中,您必须为您的子状态提供一个绝对路径(最后一个将返回给Apache,前面的路径可以是您喜欢的任何路径)。要解决400错误,请执行以下操作:

    重写规则/index.php[L]

    如何修复重定向 这将取决于index.php如何构建其重定向,但设置

    ServerName www.example.com
    UseCanonicalName On
    
    $\u SERVER[“SERVER\u NAME”]
    设置为
    www.example.com
    ,并应生成指向规范域的URL

    潜在形态
    
    服务器名www.example.com
    ServerAlias*.example.com example.com
    在上使用CanonicalName
    重新启动发动机
    #设置文档根目录
    DocumentRoot/path/to/the/app
    #如果出现问题,安装程序会记录日志以跟踪发生的情况
    #完成后对这些行进行注释
    ErrorLog/a/path/to/a/log/file
    重写日志级别5
    重写日志/a/path/to/other/log/file
    #我简化了条件,这些条件等同于你的规则
    #重写规则尝试与%{REQUEST_URI}匹配
    重写cond%{HTTP_HOST}^example\.com[NC]
    重写规则^/b//index.php[L]
    重写cond%{HTTP_HOST}^www\.example\.com[NC]
    重写规则^/(.*)$http://www.example.com/$1[R=301]
    
    如果只有一个301重定向,搜索引擎将只看到一个重定向。内部重定向没有显示-尽管您可能知道这一点。我不知道两个301重定向是否比一个好/坏。你不能从应用程序处理这些重定向吗?它显示404现在找不到。我试图将RewriteRule更改为
    RewriteRule/php,它仍然显示404。为了向您提供更多细节,我使用了Yii框架。这是Yii@PetraBarus的配置,您是否在vhost conf中添加了.htaccess?你能设置一个错误日志和一个重写日志来显示出错的地方吗?我将它们添加到我的示例中,
    AllowOverride None
    导致apache无法重新加载,并显示“语法错误”消息。但是在我查看了错误日志之后,日志说找不到路径/var/www/index.php。所以我尝试在配置中添加line
    DocumentRoot/path/to/the/app
    。它很有魅力!不再有两次重定向。
    http://example.com/b/ABCDE
    重定向到
    http://www.example.com/book/11111111-some-book
    没有中间重定向。但是,如果我不使用
    AllowOverride None
    ,可以吗?(事实上现在对我来说已经足够了,但这是真的吗