【问题标题】:.htaccess url rewrite with external site parameters.htaccess url 用外部站点参数重写
【发布时间】:2014-07-11 13:12:59
【问题描述】:

我有一个用于重定向到外部站点的页面。输出页面使用 GET 检索外部站点链接,但当外部站点具有 URL 参数时,我无法使 URL 重写正常工作。我想更改以下内容

来自: http://www.example.com/out.php?url=http://www.externalsite.com?abc=def

到: http://www.example.com/out/http://www.externalsite.com?abc=def

这是我目前拥有的代码:

RewriteRule ^out/(.*) out.php?url=$1 [QSA,L]

这可行,但 ?abc=def 在重写期间丢失。有没有办法将它包含在 URL 重写中?谢谢

【问题讨论】:

  • 使用 urlencoding,更安全,更有效,搜索示例,大量示例...
  • 使用QSA 标志,abc=def 部分不会丢失,只会合并。您不能在同一个 URL 中有 2 个查询字符串,因此您的第一个示例 URL 已损坏,这就是 Apache 不会生成它的原因。以另一种方式提取查询字符串或使用小型 PHP 脚本进行更细粒度的控制。

标签: php .htaccess mod-rewrite url-rewriting


【解决方案1】:

将此代码放入您的DOCUMENT_ROOT/.htaccess 文件中:

RewriteEngine On

RewriteCond %{THE_REQUEST} /out/(\S+) [NC]
RewriteRule ^ /out.php?url=%1 [QSA,L,NE]

您需要在此处从 %{THE_REQUEST} 变量中捕获外部 URI。

【讨论】:

  • 你不应该匹配THE_REQUEST,那里可能有很多垃圾。改为匹配REQUEST_URI
  • 是的,所有垃圾(协议和方法)都在里面。就像我说的,垃圾。因此,您的条件错误地匹配错误的 URL,例如 /i/am/out/today。如果您只需要在 URI 上进行匹配,只需使用 REQUEST_URI 并使用有效的字符串开头匹配。是的,令人吃惊的是,拥有像您这样的高代表用户将一些非常离题的东西(例如代表)带入其中。我承认我没有充分阅读这个问题,看不到它是关于查询字符串部分的,但这并没有让你的解决方案变得更好,这就是我所评论的。
  • 好的,删除我之前的评论,因为我不应该把代表带到这里。但是我可以知道协议和方法是如何变成垃圾的吗?我的意思是在这里使用RewriteCond 是强制性的,仅从RewriteRule 捕获文本将是错误的。
  • 实际有效的方法是在纯 URI 上正确匹配,然后,假设他希望结果中有 2 个 ? 部分,手动强制其中的 {QUERY_STRING} 变量。但是,我非常怀疑 Apache 是否允许这样做,并且无论如何都不会在内部将其更正为 URL 编码的替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多