我有两个子域private
,public
(但public
只是private
的别名)和一个主域www
。我需要重定向所有网址从public
子域到www
,除了现有的PDF文件和一个网址地址。我有这些规则,工作正常,但我不能添加一个特定的网址例外。
例如:
public.example.com
=〉www.example.com
//正常public.example.com/any-existing-file.pdf
=〉保持在public.example.com/any-existing-file.pdf
//正常public.example.com/any-not-existing-file.pdf
=〉www.example.com
//正常public.example.com/anything-except-certain-url-below
=〉www.example.com
//正常
1.* *public.example.com/certain-url
=〉需要停留在public.example.com/certain-url
,但它被重定向到www.example.com
//KO**
我的.htaccess
文件中有这些规则。
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^public\.example\.com$
RewriteRule ^$ http://www.example.com/ [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^private\.example\.com
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ %{REQUEST_URI}/ [R=301,QSA,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)/?$ ?page=$1 [QSA,L]
1条答案
按热度按时间v09wglhw1#
这是一个相关的规则,但是,正如所写的(以及我前面的评论中提到的),这只重定向对文档根的请求(如
^$
正则表达式所示)。即,该规则只将http(s)://public.example.com/
重定向到http://www.example.com/
(为什么是http
?),仅此而已。在场景#3、#4和#5中,您可以看到重定向的唯一方式是,如果您有(或 * 有 *)一个不同的规则执行此操作,并且您现在可能看到缓存的重定向。301(永久)重定向由浏览器永久缓存。
但是,您也通过前端控制器来路由对所有不存在文件的请求(最后一条规则),除非您忽略了包含处理请求的实际文件(我假设为
index.php
,因为您已经标记了问题php
),因此您依赖于正确设置DirectoryIndex
。要在
.htaccess
中执行必要的重定向,您需要将上面的规则更改为类似下面的内容,将其拆分为两个规则:请注意,
RewriteRule
* 模式 * 匹配的URL路径不是以斜杠开头。首先用302(临时)重定向进行测试,以避免潜在的缓存问题。在测试之前,您需要清除浏览器(和任何中间缓存)。
但是,如前所述,您可能仍然需要首先解决这些重定向来自何处,因为它们不是来自问题中发布的规则。