urlencoded正斜杠正在破坏URL

San*_*ath 70 .htaccess url-rewriting url-encoding http-status-code-404

关于系统

我的项目中有这种格式的URL: -

http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0
Run Code Online (Sandbox Code Playgroud)

其中关键字/类对意味着使用"class"关键字进行搜索.

我有一个常见的index.php文件,它为项目中的每个模块执行.只有一个重写规则可以从URL中删除index.php: -

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)

我在阅读搜索URL时准备搜索URL和urldecode()时使用urlencode().

问题

只有正斜杠字符会破坏导致404页面未找到错误的URL.例如,如果我搜索one/twoURL是

http://project_name/browse_by_exam/type/tutor_search/keyword/one%2Ftwo/new_search/1/search_exam/0/search_subject/0/page_sort/
Run Code Online (Sandbox Code Playgroud)

我该如何解决?我需要将index.php隐藏在URL中.否则,如果不需要,那么正斜杠就没有问题了,我可以使用这个URL: -

http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one
%2Ftwo/new_search/1/search_exam/0/search_subject/0
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 142

%2F出于安全原因,Apache拒绝路径部分中的所有URL :脚本不能正常(即没有重写)告诉区别%2F/由于PATH_INFO环境变量自动进行URL解码(这是愚蠢的,但是长期存在的) CGI规范的一部分,所以没有什么可以做的.

您可以使用该AllowEncodedSlashes指令关闭此功能,但请注意其他Web服务器仍然会禁止它(没有选项将其关闭),其他字符也可能是禁忌(例如%5C),%00特别是将永远被Apache和IIS阻止.因此,如果您的应用程序依赖于%2F路径部分中的字符或其他字符,那么您将限制兼容性/部署选项.

我在准备搜索URL时使用urlencode()

您应该使用rawurlencode(),而不是urlencode()用于转义路径部分.urlencode()如果命名错误,它实际上是用于application/x-www-form-urlencoded查询字符串或POST请求正文中的数据,而不是URL的其他部分.

不同之处在于+并不意味着路径部分的空间.rawurlencode()将正确生成%20,这将在表单编码数据和URL的其他部分中工作.

  • 啊,这就是为什么削减斜线的原因.完善的诊断和治疗. (4认同)
  • 嗨Bobince,`rawurlencode()`也将正斜杠转换为'%2F`,这仍然会破坏我的URL.我实际上并不明白`rawurlencode()`如何解决我的问题. (4认同)
  • 不是,这是一个与 `+` 和 `%20` 相关的附带问题。修复是“AllowEncodedSlashes”,尽管依赖它会降低您的部署可能性(即,您无法在 IIS 上部署它,并且其他用户(如果有)在使用共享主机时将无法部署它无法访问`httpd.conf`)。还有一些工具或蜘蛛可能会被它弄糊涂。尽管`%2F` 表示路径部分中的`/` 按照标准是正确的,但大多数网络都避免使用它。 (2认同)

Raf*_*shi 8

在url编码后将%2F替换为%252F

PHP

function custom_http_build_query($query=array()){

    return str_replace('%2F','%252F', http_build_query($query));
}
Run Code Online (Sandbox Code Playgroud)

通过htaccess处理请求

的.htaccess

RewriteCond %{REQUEST_URI} ^(.*?)(%252F)(.*?)$ [NC]
RewriteRule . %1/%3 [R=301,L,NE]
Run Code Online (Sandbox Code Playgroud)

资源

http://www.leakon.com/archives/865


小智 5

在 Apache 中,AllowEncodedSlashes On 将防止请求立即被 404 拒绝。

关于如何解决这个问题的另一个想法。