通配符无提示重定向到获取参数

问题描述 投票:0回答:1

因此,我试图让我网站上的每个用户都拥有一个子域

[每当用户连接到通配符子域时,它都会将用户拉到domain.com/send.php?username='subdomain',但我想隐藏该重定向,因为它对用户来说显示为subdomain.domain.com

我直接在Apache Virtual Host上进行修改,这是我的条件

RewriteEngine onRewriteCond%{SERVER_NAME} = domain.comRewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R =永久]RewriteCond%{HTTP_HOST}!^(www)。 [NC]RewriteCond%{HTTP_HOST} ^(。)。(。)。com [NC]RewriteRule(。https://www.%2.com/send.php?username=%1 [NC,L]RewriteCond%{HTTP_HOST} ^(。)$ [NC]RewriteRule ^https://%1%{REQUEST_URI} [L,NE,R = 301]

如果我使用[P]标志,则会收到403错误,并且即使我没有R也使用L标志,它会显示重定向的URL。

我正在努力解决问题,谢谢!

.htaccess redirect subdomain virtualhost wildcard-subdomain
1个回答
0
投票

您的规则有很多问题。匹配模式中的一些将永远不会匹配,请阅读有关正则表达式的更多信息。而且整体逻辑在某些部分看来是相反的,您想再考虑一下。

这里是一种替代方法,应为您指明正确的方向:

RewriteEngine on

# unconditionally redirect http to https
RewriteCond RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,END]

# redirect argument "username=xxx" to the "subdomain"
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{QUERY_STRING} (?:^|&)username=([a-z][a-z0-9-]+)(?:&|$)
RewriteRule ^ https://%1.example.com%{REQUEST_URI} [QSD,R=301]

# internally rewrite "subdomain" requests
RewriteCond %{HTTP_HOST} ^(?:(www)\.)?([^.]+)\.example\.com$ [NC]
RewriteRule ^ %{REQUEST_URI}?username=%1 [QSA,END]

我还没有测试过,只是写下来,所以我们希望其中没有琐碎的错字:-)

最好先从302临时重定向开始,然后在确定一切设置正确后,再将其更改为301永久重定向。这样可以防止在尝试时缓存问题...

如果使用上述规则收到内部服务器错误(http状态为500),则很可能是您运行的Apache http服务器的版本非常旧。在这种情况下,您将在http服务器错误日志文件中看到对不支持的[END]标志的明确提示。您可以尝试升级或使用旧的[L]标志,在这种情况下它可能会起作用,尽管这在一定程度上取决于您的设置。

此实现将在http服务器主机配置或分布式配置文件(“ .htaccess”文件)中同样起作用。显然,重写模块需要加载到http服务器内部并在http主机中启用。如果使用分布式配置文件,则需要注意在主机配置中完全启用了它的解释,并且该解释位于主机的DOCUMENT_ROOT文件夹中。

和一般说明:您应该始终喜欢将此类规则放置在http服务器主机配置中,而不要使用分布式配置文件(“ .htaccess”)。这些分布式配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,并且确实降低了http服务器的速度。仅当您无法访问真正的http服务器主机配置(阅读:真正便宜的服务提供商)或坚持编写自己的规则的应用程序(这显然是安全的噩梦)时,才提供它们作为最后的选择。

© www.soinside.com 2019 - 2024. All rights reserved.