【问题标题】:Redirect all URL except one at alias domain重定向除别名域中的一个以外的所有 URL
【发布时间】:2023-01-08 09:38:49
【问题描述】:

我有两个子域privatepublic(但public只是private的别名)和一个主要领域www。我需要将所有 URL 从 public 子域重定向到 www,除了现有的 PDF 文件和一个 URL 地址。我有这些工作正常的规则,但我无法为某个特定的 URL 添加例外。

例如。:

  • public.example.com => www.example.com // 好的
  • public.example.com/any-existing-file.pdf => 停留在public.example.com/any-existing-file.pdf // OK
  • public.example.com/any-not-existing-file.pdf => www.example.com // 好的
  • public.example.com/anything-except-certain-url-below => www.example.com // 好的
  • 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]

【问题讨论】:

  • 您必须在此处使用其他一些规则,否则您会看到缓存从较早的(错误的)规则重定向。 301 由浏览器持久缓存(可能还有中间缓存)。您发布的规则只会将 public 子目录的根目录重定向到 www.而已。这些规则不会将 public.example.com/anything 重定向到 www。您是否在为您的静态资源提供服务的前端代理之后?这可以解释为什么 public.example.com/any-existing-file.pdf 没有被重定向。
  • 不应该有任何其他规则。这是我的 .htaccess 的全部内容。在每次使用之前我都会清除缓存,所以它也不应该被缓存。关于最后一个问题,很遗憾我不知道。这是普通的虚拟主机,我没有任何特殊权利。
  • @MrWhite 所以请你根据我第一篇文章中的例子给我一些规则,哪些应该做我需要做的事情?我将用它们替换当前的,让我们看看它是否会起作用。
  • 澄清一下,你只想重定向到 www 主页,原来的 URL 路径被删除了吗?
  • @MrWhite 是的,重定向后我不需要原始 url-path。

标签: php .htaccess


【解决方案1】:
RewriteCond %{HTTP_HOST} ^public.example.com$
RewriteRule ^$ http://www.example.com/ [R=301,L]

这是有问题的相关规则。但是,如所写(以及我之前的评论中提到的),这只会重定向对文档根目录的请求(如 ^$ 正则表达式所示)。 IE。此规则仅将 http(s)://public.example.com/ 重定向到 http://www.example.com/(为什么是 http?),仅此而已。

您可以看到场景 #3、#4 和 #5 的重定向的唯一方法是,如果您有(或) 执行此操作的不同规则,您现在可能会看到缓存的重定向。 301(永久)重定向由浏览器持久缓存。

但是,您还通过前端控制器(最后一条规则)路由对所有不存在文件的请求,除非您忽略了包含处理请求的实际文件(我假设为index.php,因为您已将问题标记为@987654327 @),因此您依赖正确设置的DirectoryIndex。因此,您的前端控制器也可能会启动这些重定向(在 PHP 中)?

要在 .htaccess 中执行必要的重定向,您需要将上述规则更改为类似以下内容,将其分成两条规则:

# Skip the next rule if requesting a PDF file that exists
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .pdf$ - [S=1]

# Redirect public to www except "/certain-url"
RewriteCond %{HTTP_HOST} ^public.example.com [NC]
RewriteRule !^certain-url$ http://www.example.com/ [R=301,L]

请注意,RewriteRule 匹配的 URL 路径图案不以斜杠开头。

首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。在测试之前,您需要清除浏览器(和任何中间缓存)。

但是,如前所述,您可能仍然需要首先解决这些重定向的来源,因为它们不是来自问题中发布的规则。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 2013-04-28
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多