你必须了解几个概念。一旦服务器收到用户请求的 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]