html%2b怎么转换成加号,Apache mod_rewrite%2B和加号(+)符号

不,这与引用的问题不完全相同。这里的问题特别是加号和Apache的答案:mod_rewrite:Spcaes& URL中的特殊字符无法正常工作。

斜杠也存在问题,请参阅http://httpd.apache.org/docs/current/mod/core.html#allowencodedslashes

(但你确实需要访问Apache配置来执行此操作 - .htaccess不会这样做)。

事实上,单独使用重写规则是不可能的。 Apache在重写之前对URL进行解码,但它不理解加号:http://example.com/a+b.html不会传递一个名为的文件

“a b.html”。

加号被PHP解码为查询字符串的$ _GET数组(或任何相关的语言机制),因为浏览器中的表单处理程序将它们放入。所以Apache会在应用重写之前将%2B转换为+,并保留+它本身就是一个意思,你无法区分它们。

当然,有人可能会争辩说,用作空间的+在这些URL中根本就是无效的,而且应该只使用%20。但是,如果你无法控制生成它们,你一定会看到它们。浏览器不会自动生成它们。

答案是DIY,在许多方面它更可预测和更简单:

RewriteRule。* index.php [L]

因此,一切都变成了index.php,并且没有尝试构造查询字符串。如果您想要排除某些模式,例如那些有斜杠的,或者存在明确文件的那些,明显的修改适用。例如

RewriteCond%{REQUEST_FILENAME}! - f

然后在index.php中

$ uri = substr($ _ SERVER ['REQUEST_URI'],1); //删除前导斜杠

$ qmpos = strpos($ uri,'?'); //是否有问号,如果有的话

if($ qmpos!== FALSE){$ uri = substr($ uri,0,$ qmpos); } //仅在q.m之前的位

$ decoding = urldecode($ uri); //解码URL之前的部分

if(!empty($ decoding)){$ _GET ['args'] = $ decoding; } //将结果添加到$ _GET

解码原始请求(不包括前导斜杠 - 如果您在层次结构中更深层次会略有不同,但原理相同 - 并排除任何其他查询字符串),并根据PHP的常规规则解码args参数将它放入$ _GET,以便您可以通常的方式处理它与$ _GET查询字符串参数的其余部分。

我认为这应该适用于空URL(http://example.com/)或仅包含查询字符串(http://example.com/?foo=1)的URL,以及简单的案例(http: //example.com/bar)以及带有查询字符串的案例(http://example.com/bar?foo=1)。毫无疑问,类似的方法适用于其他语言。

在您的特定情况下,您实际上根本不希望在PHP中解码的优点。没关系,请使用rawurldecode,而不是使用rawurldecode。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值