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/two
URL是
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的其他部分中工作.
在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
归档时间: |
|
查看次数: |
111125 次 |
最近记录: |