Apache重写-重定向通配符子域并处理内部URL缩短器
我在重定向通配符子域和处理内部URL缩短器方面有问题 假设我的应用程序中有一个内部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图书名称 因此,每当我在诸如公告板、微博网站或海报
example.com/b/ABCDE
这将转化为
example.com/book/12345678-the-book-name
由/b/
引用的脚本(我使用可以处理URL规则的PHP框架)将短IDABCDE
转换为图书真实ID12345678
(以及标题“图书名称”),然后将其重定向到图书的永久URLexample.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
所以,我的问题是
example.com/b/ABCDE
,不带www
前缀),但仍在一个重定向中^/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。所以我尝试在配置中添加lineDocumentRoot/path/to/the/app
。它很有魅力!不再有两次重定向。http://example.com/b/ABCDE
重定向到http://www.example.com/book/11111111-some-book
没有中间重定向。但是,如果我不使用AllowOverride None
,可以吗?(事实上现在对我来说已经足够了,但这是真的吗