【问题标题】:Exclude specific subdomain or no subdomain in htaccess RewriteRule在 htaccess RewriteRule 中排除特定子域或没有子域
【发布时间】:2017-11-28 03:27:03
【问题描述】:

我将动态内容和静态内容保存在我的 Web 应用程序的不同子域中,但我最近发现,如果直接调用动态内容,可以在我的静态子域 (www.) 上查看动态内容,或者根本没有子域。


网址结构:

http(s)://(subdomain).(domain).(tld)/(static page) OR (direct/random hash) OR (secure/random hash)

所有静态内容都可以通过“WWW”访问,这会导致我的 SEO 友好域,例如

http(s)://www.domain1.com/about
http(s)://www.domain1.com/
http(s)://www.domain2.com/about
http(s)://www.domain2.com/

虽然通过 Web 应用查看的动态内容会从诸如

的域访问
http(s)://dynamic1.domain1.com/direct/randomhash
http(s)://dynamic2.domain1.com/direct/randomhash
http(s)://dynamic1.domain2.com/direct/randomhash
http(s)://dynamic2.domain2.com/direct/randomhash

这是我当前的 .htaccess 文件

重写 URI 以securedirect 开头的动态链接以及 index.php 文件的任何文件扩展名的规则。

Header set Connection keep-alive
<IfModule mod_dir.c>
    DirectorySlash Off
</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^index.php  - [L]
    RewriteRule ^(secure|direct)  /index.php [L]
    RewriteCond %{REQUEST_URI} !^/server-status
    RewriteCond %{REQUEST_URI} !^/public/cache
    RewriteRule !\.(png|gif|css|jpg|zip|js|html|htm|swf|ico|fon|ttf|otf|svg|woff|woff2|eot)$  /index.php [L]
</IfModule>

以上内容目前正在运行,但我的问题是,如果用户只是将子域从用于动态内容的子域更改为 WWW,它仍然可以工作,并且会导致可以从我的 SEO 友好子域访问动态内容。

我希望能够编辑此规则RewriteRule ^(secure|direct) /index.php [L],以便在存在活动的www. 子域或没有子域的情况下将其排除在外,同时如果域或子域是其他任何东西,它仍然可以工作。

也就是说子域或域仍然是通配符,除非子域是www.


我假设我必须将 %{HTTP_HOST} 添加到 RewriteRule ^(secure|direct) /index.php [L] 并使用正则表达式来允许任何子域、域和 tld 但我不确定如果 http 主机以 WWW 开头如何排除。或根本没有子域。

我的最终目标是使securedirect 路径不能通过www. 或没有子域查看,同时仍与任何其他子域/域一起工作。

【问题讨论】:

  • 您是否尝试过检查RewriteCond 中的www.
  • 顺便说一句,png|gif|css|jpe?g|zip|js|html?|swf|ico|fon|[ot]tf|svg|woff2?|eot 的性能略好于您当前的正则表达式,并且还允许使用 jpeg
  • 所以 /secure/direct 应该只允许来自主域(www 和没有 www)?
  • @ctwheels 感谢我做出这些更改的建议!
  • 我刚刚实现了他的答案并且它正在工作,标记为已回答;谢谢!

标签: regex .htaccess mod-rewrite


【解决方案1】:

你可以使用:

RewriteCond %{HTTP_HOST} ^(?:www\.)?[^.]+\.[^.]+$ [NC]
RewriteRule ^(secure|direct)  /index.php [L]

【讨论】:

  • @JeremyJones 是的,因为您不理解这个问题,它会将这些查询重定向到索引页面而不是目标页面。
【解决方案2】:

您应该在处理“安全”和“直接”请求的规则中添加一个条件,以便它们只能来自您匹配的子域,而不是 www 的。

RewriteCond %{HTTP_HOST}  ^dynamic[0-9]+\.[a-z]+ 
RewriteRule ^(secure|direct)  /index.php [L]

这样,只有具有与该规则匹配的子域的请求才会被重新写入 PHP 脚本。如果用户将子域改回 www,或任何与您在条件中指定的模式不匹配的其他内容,则请求将无法通过 PHP 脚本。

如果您的动态子域名称确实是随机的,那么只需使用您所知道的其他名称,这样“www”就不会匹配,例如,如果它们都至少有四个字符长,那么这个模式会工作:

RewriteCond %{HTTP_HOST}  ^[^.][^.][^.][^.]+\. 
RewriteRule ^(secure|direct)  /index.php [L]

因为字符串 'www.'不匹配以四个或更多非点开头然后是一个点的模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2021-08-14
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多