当前位置: 首页 > 知识库问答 >
问题:

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

段干子晋
2023-03-14

所以我试图让我的网站上的每个用户都有一个子域

每当用户连接到通配符子域时,它就会将用户带到域。com/send。php?username='subdomain',但我想隐藏显示为subdomain的重定向。领域com为用户提供

我直接在Apache虚拟主机上修改,下面是我的条件

重写引擎在
重写康德%{SERVER_NAME}=domain.com
重写规则^https://%{SERVER_NAME}%{REQUEST_URI}[END, NE, R=永久]

重写康德%{HTTP_HOST}!^(www).[NC]
重写康德%{HTTP_HOST} ^(.).(.).com[NC]
重写规则(.)https://www.%2.com/send.php?username=%1[NC, L]

重写康德%{HTTP_HOST}^(.)$[NC]
重写规则^https://%1%{REQUEST_URI}[L, NE, R=301]

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

我在努力让事情过去,谢谢!

共有1个答案

邓阳伯
2023-03-14

你的规则有很多问题。匹配模式的Spome永远不会匹配,请阅读更多关于正则表达式的内容。而整体逻辑在部分上是相反的,你需要再仔细考虑一下。

这里有一个替代方法,应该会给你指明正确的方向:

RewriteEngine on

# unconditionally redirect http to https
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{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-]+)(?:&|$) [NC]
RewriteRule ^ https://%1.example.com%{REQUEST_URI} [QSD,R=301]

# internally rewrite "subdomain" requests and specify the user name as argument
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\u ROOT文件夹中。

还有一个一般性的注释:您应该总是更喜欢将这些规则放在http服务器主机配置中,而不是使用分布式配置文件(“.htaccess”)。这些分布式配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,而且它们确实降低了http服务器的速度。只有在您无法访问真正的http服务器主机配置(读:真正廉价的服务提供商)或坚持编写自己的规则的应用程序(这显然是一个安全噩梦)的情况下,才提供它们作为最后一个选项。

 类似资料:
  • 问题内容: 我正在使用express (最新)和以下代码: POST重定向到GET,但PUT重定向到PUT。是否可以将PUT重定向到GET(与POST相同)? 问题答案: 在详细讨论之前,下面是解决问题的一种方法: 默认情况下,Express使用HTTP代码302进行重定向。根据HTTP规范,这可以防止POST / PUT请求被重定向为POST / PUT请求,并解释了您在代码中观察到的内容: 如

  • 问题内容: 我有一个网页。该网页将用户重定向到另一个网页,或多或少通过以下方式: 好吧,您知道,我要做的是将GET参数转换为POST参数。不要告诉我这很不好,我知道我自己,这也不是我真正要做的,重要的是我从数组中收集数据并尝试通过POST将其提交到另一个页面。但是,如果用户关闭了JavaScript,它将无法正常工作。我需要知道的是:有没有一种方法可以通过PHP传递POST参数,以便重定向也可以通

  • 问题内容: 摘自Effective Java Chapter 5(泛型): 这两个声明中的哪一个是可取的,为什么?在公共API中,第二个更好,因为它更简单。您传入一个列表(任何列表),该方法交换索引元素。没有类型参数值得担心。通常,如果类型参数在方法声明中仅出现一次,则将其替换为通配符。 我不明白,为什么第二个选项对我的API客户端来说更简单?我可以将相同的参数传递给第一个和第二个方法。第二种方法

  • 你好,我有一个应用程序,我想在成功创建一个新房间后重定向用户。我想把他重定向到URL中带有房间ID的页面,但我想用这个重定向发送数据到组件状态。 应用程序内。我有 IM重定向从CreateRoom组件像这样 这很好,可以让我改变方向。这是LobbyView的代码 但有一个主要的问题,它重定向我,但总是没有状态参数ownerName... 关键是:房间的创建者将被重定向到URL,以显示房间信息与所有

  • 是否可以使参数验证集与通配符一起工作? 我希望在位置接受0-100。 错误消息: 无法验证参数“variable”得参数.参数“6.1.1.0”不属于集合“6.1...”由ValidateSet属性指定。提供一个集合中的参数,然后重试该命令。+CategoryInfo:InvalidData:(:)[],ParentContainsErrorRecordException+FullyQualifi

  • 我正在使用keydepot身份验证对angular应用程序进行身份验证,到目前为止,我已成功将登录重定向到keydeport服务器。但当重定向而不是登录页面时,我会收到一个500错误页面,其中包含消息