apache 重定向所有URL,别名域中的URL除外

w8rqjzmb  于 2023-01-09  发布在  Apache
关注(0)|答案(1)|浏览(136)

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

  1. public.example.com =〉www.example.com//正常
  2. public.example.com/any-existing-file.pdf =〉保持在public.example.com/any-existing-file.pdf//正常
  3. public.example.com/any-not-existing-file.pdf =〉www.example.com//正常
  4. 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]
v09wglhw

v09wglhw1#

RewriteCond %{HTTP_HOST} ^public\.example\.com$
RewriteRule ^$ http://www.example.com/ [R=301,L]

这是一个相关的规则,但是,正如所写的(以及我前面的评论中提到的),这只重定向对文档根的请求(如^$正则表达式所示)。即,该规则只将http(s)://public.example.com/重定向到http://www.example.com/(为什么是http?),仅此而已。
在场景#3、#4和#5中,您可以看到重定向的唯一方式是,如果您有(或 * 有 *)一个不同的规则执行此操作,并且您现在可能看到缓存的重定向。301(永久)重定向由浏览器永久缓存。
但是,您也通过前端控制器来路由对所有不存在文件的请求(最后一条规则),除非您忽略了包含处理请求的实际文件(我假设为index.php,因为您已经标记了问题php),因此您依赖于正确设置DirectoryIndex
要在.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(临时)重定向进行测试,以避免潜在的缓存问题。在测试之前,您需要清除浏览器(和任何中间缓存)。
但是,如前所述,您可能仍然需要首先解决这些重定向来自何处,因为它们不是来自问题中发布的规则。

相关问题