2

以下可能吗?

  1. 用户请求 urlhttp://example1.com/example.php并且 apache 打开http:// example1.com/example.php?id=1

  2. 用户请求 urlhttp://example2.com/example.php并且 apache 打开http:// example2.com/example.php?id=2

但是用户不应该在他的浏览器地址栏中看到 id(用户应该只看到http://example1.com/example.phpor http://example2.com/example.php)。

您可以说该 id 对用户是不可见的,但已转移到example.php.

我该如何实施?

4

2 回答 2

0

这是正确的解决方案吗?

RewriteEngine On
RewriteRule ^/example.php http://example1.com/example.php$1 [P]
ProxyPassReverse /example.php?id=1 http:// example1.com/example.php

RewriteEngine On
RewriteRule ^/example.php http://example2.com/example.php$1 [P]
ProxyPassReverse /example.php?id=2 http:// example2.com/example.php
于 2012-12-13T08:08:59.933 回答
0

你必须了解几个概念。一旦服务器收到用户请求的 url,他可以做几件事

  • 从 url 获取请求的路径并在不修改的情况下使用它。这是默认解决方案
  • 将请求的路径映射到任何其他物理路径,这可以通过 Alias、AliasMatch 或 RewriteRules 完成。
  • 将请求的路径映射到另一个网站,同时隐藏请求另一个网站的事实。那是代理解决方案,thta mod_proxy 或 mod_rewrite 可以处理(但你不需要)
  • 使用重定向指令或 mod_rewrite(瑞士刀)将用户重定向到另一条路径,向他发送一个要使用的新 url,进行另一个客户端/服务器往返。但你不需要那个。

因此,您希望仅在服务器端重新映射请求的路径。

假设我们将使用 mod rewrite 来制作这个映射。如果您检查RewriteRule 中可用的所有标签此处为摘要),有趣的是:

passthrough|PT :强制将生成的 URI 传递回 URL 映射引擎,以处理其他 URI 到文件名的转换器,例如 Alias 或 Redirect。

qsappend|QSA:将来自原始请求 URL 的任何查询字符串附加到在重写目标中创建的任何查询字符串

last|L:立即停止重写过程,不再应用任何规则。特别注意每个目录和 .htaccess 上下文的注意事项(另请参见 END 标志)

nocase|NC:使模式比较不区分大小写。

PT标志的详细信息表明:

默认情况下,RewriteRule 中的目标(或替换字符串)假定为文件路径。

好吧,这对你来说可能已经足够了。但是使用 PT 是一件好事,如果您有其他 apache 配置元素,您应该尝试让它们在 mod_rewrite 作业之后应用。

所以...假设您可能需要处理一些查询字符串参数,并且此 id 参数基于请求中的域名,并且只有 example.php 脚本需要此行为;你应该从这样的规则开始你的研究(未经测试):

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1.com$ [nocase]
RewriteRule ^example\.php$ example.php?id=1 [passthrough,qsappend,last]
RewriteCond %{HTTP_HOST} ^example2.com$ [nocase]
RewriteRule ^example\.php$ example.php?id=2 [passthrough,qsappend,last]
于 2012-12-13T16:01:36.497 回答