【发布时间】: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