在Drupal 6中将URI作为URL参数传递
我在尝试将绝对URI作为启用了干净URL的参数传递时遇到了问题 我把hook_menu()设置成这样:在Drupal 6中将URI作为URL参数传递,drupal,url-rewriting,Drupal,Url Rewriting,我在尝试将绝对URI作为启用了干净URL的参数传递时遇到了问题 我把hook_menu()设置成这样: function mymodule_menu() { return array( 'page/%' => array( 'title' => 'DBpedia Display Test', 'page callback' => 'mymodule_dbpedia_display', 'page arguments' => array(1),
function mymodule_menu() {
return array(
'page/%' => array(
'title' => 'DBpedia Display Test',
'page callback' => 'mymodule_dbpedia_display',
'page arguments' => array(1),
),
);
}
在页面回调中:
function mymodule_dbpedia_display($uri) {
// Make an HTTP request for this URI
// and then render some things
return $output;
}
我希望做的是以某种方式将完整URI(例如“”)传递给我的页面回调。我尝试了一些方法,但到目前为止没有任何效果
完全破坏了Drupal的重写
给出了404
只返回“http:”,这很有意义
我可能会使用$\u GET提取整个查询字符串,但我想我希望得到一个更“Drupal”的解决方案。有什么建议吗?如果URL的来源是由您控制的,为什么不使用可逆编码(如base64)对字符串进行编码,从而删除任何棘手的字符,然后在执行菜单回调时进行解码。例如:
$link = 'http://www.example.com?uri='. base64_encode($uri);
...
function mymodule_dbpedia_display($uri) {
$uri = base64_decode($uri);
// Make an HTTP request for this URI
// and then render some things
return $output;
}
如果URL的来源是由您控制的,那么为什么不使用可逆编码(如base64)对字符串进行编码,从而删除任何棘手的字符,然后在执行菜单回调时进行解码呢。例如:
$link = 'http://www.example.com?uri='. base64_encode($uri);
...
function mymodule_dbpedia_display($uri) {
$uri = base64_decode($uri);
// Make an HTTP request for this URI
// and then render some things
return $output;
}
我以前也遇到过这个问题,尝试做同样的事情(RDF浏览)。我通过在URI上使用rawurlencode和rawurldecode解决了这个问题 所以在创建链接时
l('Click Here', 'page/' . rawurlencode($uri));
当使用$uri变量时,执行rawurldecode()
它会给你一个URI,比如
http://mysite.com/page/http%253A%252F%252Fdbpedia.org%252Fresource%252FCoffee
我以前也遇到过这个问题,尝试做同样的事情(RDF浏览)。我通过在URI上使用rawurlencode和rawurldecode解决了这个问题 所以在创建链接时
l('Click Here', 'page/' . rawurlencode($uri));
当使用$uri变量时,执行rawurldecode()
它会给你一个URI,比如
http://mysite.com/page/http%253A%252F%252Fdbpedia.org%252Fresource%252FCoffee
这应该是可行的;这是一个好主意。您可以在该线程中尝试修补程序,但您最好的选择可能是在URL编码的基础上进行不同的编码,正如其他人所建议的那样;这是一个好主意。您可以在该线程中尝试修补程序,但您最好的选择可能是在URL编码的基础上进行不同的编码,正如其他人所建议的那样。使用
page/%
,而不是使用page/%menu-trail
%menu-trail
将URL的其余部分作为单个字符串传递,在您的示例中,该字符串将作为$uri
传递给菜单回调,而不是使用page/%
,使用page/%menu-trail
%menu\u trail
将URL的其余部分作为单个字符串传递,在您的示例中,该字符串将作为$uri
传递到菜单回调。这比所有这些容易得多,只要您能够对自己的uri进行编码-阅读这些文档,所有秘密都将被揭示:
干杯这比这容易多了,只要你能对自己的URI进行编码——阅读这些文档,所有的秘密都会被揭示出来:
干杯这几乎奏效了。我认为关键不在于使用rawurlencode()(而不仅仅是urlencode()),而是它在与l()函数一起使用时得到了双重编码。然而,不知怎的,Drupal仍然看到第一个斜杠,arg(1)只返回“http:”。你是怎么做到的?这对我来说似乎很管用。我又检查了一遍,看起来还可以。我在灯堆上使用D7,不知道它是否会有任何区别。我应该提到我正在使用D6。似乎参数处理可能已更改。这几乎有效。我认为关键不在于使用rawurlencode()(而不仅仅是urlencode()),而是它在与l()函数一起使用时得到了双重编码。然而,不知怎的,Drupal仍然看到第一个斜杠,arg(1)只返回“http:”。你是怎么做到的?这对我来说似乎很管用。我又检查了一遍,看起来还可以。我在灯堆上使用D7,不知道它是否会有任何区别。我应该提到我正在使用D6。似乎争论的处理方式可能已经改变了。谢谢,如果归结到这一点,这将起到作用。但是,如果可能的话,我希望避免编码到难以辨认的东西。谢谢,如果归结到这一点,这将完成这项工作。不过,如果可能的话,我想避免编码到难以辨认的地方。谢谢。%menu_trail方法不像您描述的那样简单,但它引导我朝着正确的方向前进,我让它工作起来了。我找到了解决办法。我使用了一个%wildcard_load()函数将参数映射内爆回字符串。可惜这并不简单,但很有效。我的报告是用英文写的。事实上,我正在开发()的一个模块中使用它,它是有效的。您的用法是不同的。%菜单的尾部部分永远不会传递给回调。opensearch模块和核心搜索模块都使用search\u GET\u keys()直接从$\u GET提取参数。据我所知,%menu\u tail主要允许在URL中有额外斜杠时正确写入页面上的链接。D7的情况也是如此。感谢您指出opensearch模块,期待着在一些即将到来的项目中尝试。谢谢。%menu_trail方法不像您描述的那样简单,但它引导我朝着正确的方向前进,我让它工作起来了。我找到了解决办法。我使用了一个%wildcard_load()函数将参数映射内爆回字符串。可惜这并不简单,但很有效。我的报告是用英文写的。事实上,我正在开发()的一个模块中使用它,它是有效的。您的用法是不同的。%菜单的尾部部分永远不会传递给回调。opensearch模块和核心搜索模块都使用search\u GET\u keys()直接从$\u GET提取参数。据我所知,%menu\u tail主要允许在URL中有额外斜杠时正确写入页面上的链接。D7的情况也是如此。感谢您指出opensearch模块,期待着在一些即将到来的项目中尝试。