【问题标题】:Block access to all but a single URI with htaccess from a subdomain使用子域的 htaccess 阻止访问除单个 URI 之外的所有 URI
【发布时间】:2016-02-08 19:01:07
【问题描述】:

我正在尝试使用htaccess 来阻止访问我的网站,除非请求将发送到特定的 URI,但仅限于从某个子域访问时。

基本上,我有许多子域,用于绕过浏览器请求限制,以加快加载包含许多图像的页面。我已经测试过,这运行良好,防止浏览器阻止请求,直到其他人完成。

我想要实现的是阻止从这些子域访问站点的其余部分,因此它们只能访问以/images 开头的 URI。这样做的目的是避免我的网页或子域的重复 URL 意外在 Google 中被编入索引。

尽我所能,我做不到,这是我目前所拥有的:

<IfModule mod_rewrite.c>

    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Prevent access to anything but the /images URI from subdomains
    RewriteCond %{HTTP_HOST} ^cdn[1-9]\.domain.localhost$ [NC]
    RewriteRule !^/images.* - [R=404]

</IfModule>

我希望子域访问的 URI 是:

domain.localhost/images/(products|retailers)/400/400/filename.jpg

你可能已经猜到这不是一个物理文件夹结构,它是我的 Laravel PHP 应用程序中的一个路由。

根据我的理解,底部规则应该是“如果请求来自匹配的域,并且请求 URI 不以 /images 开头,则重定向到 404 错误,但由于它不起作用,我一定很远离题。我认为问题可能是由于规则的顺序,但我不确定。

有什么建议吗?

【问题讨论】:

  • 值得注意的是,Laravel 需要并使用超出底部规则的所有内容。
  • %{HTTP_HOST} 匹配当前服务器的(虚拟)主机名,而不是引用者/客户端的主机名。
  • 应该没问题吧?当通过子域访问该站点时,它 %{HTTP_HOST} 实际上应该是子域吗?还是我误会了?
  • 啊,是的,当然。也许是这样:去掉第一个/,像这样:RewriteRule !^images.* - [R=404]
  • 不怕。我相信问题在于 RewriteRule。我可以使用RewriteRule ^.* - [R=404] 进行测试以确保子域匹配。这样,来自子域 404 的所有请求,但来自主域的请求都可以。我的想法是,如果先处理其他规则而只是猜测,mod_rewrite 不会将 URI 视为 /images

标签: apache .htaccess mod-rewrite url-rewriting http-status-code-404


【解决方案1】:

RewriteRule 指令接收每个目录的 URI。因此,它接收到的路径不会包含前导斜杠 (/)。这仅适用于在服务器或虚拟主机上下文中进行的重写。

我建议您使用 %{REQUEST_URI} 变量代替您的规则:

RewriteCond %{HTTP_HOST} ^cdn[1-9]\.domain\.localhost$ [NC]
RewriteCond %{REQUEST_URI} !^/images\b [NC]
RewriteRule ^ - [R=404]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多