.htaccess - urlencoded 正斜杠破坏了 URL

标签 .htaccess url-rewriting http-status-code-404 url-encoding

关于系统

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

http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0

其中关键字/类对表示使用“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]

我在准备搜索 URL 时使用 urlencode(),在读取搜索 URL 时使用 urldecode()。

问题

只有正斜杠字符会破坏 URL,从而导致 404 页面未找到错误。 例如,如果我搜索 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/

我该如何解决这个问题?我需要将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

最佳答案

出于安全原因,Apache 拒绝所有路径部分带有 %2F 的 URL:脚本通常无法(即无需重写)区分 %2F 之间的区别和 / 由于 PATH_INFO 环境变量会自动进行 URL 解码(这很愚蠢,但这是 CGI 规范中长期存在的一部分,因此对此无能为力)。

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

I am using urlencode() while preparing the search URL

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

不同之处在于 + 并不表示路径部分中的空格。 rawurlencode() 将正确生成 %20,这适用于表单编码数据和 URL 的其他部分。

关于.htaccess - urlencoded 正斜杠破坏了 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3235219/

相关文章:

.htaccess - 使用 .htaccess 的动态子域

java - 在Java中,如何避免HTTP 404获取文件://URL with special characters in it?

html - htaccess 文件不改变文件扩展名

apache - htaccess 无法很好地重写隐藏扩展名

linux - htaccess 重写在 WAMP 上离线工作,但在 Linux 主机上无法在线工作

javascript - Angular2 [src] 动态加载图像时导致 404 错误

http - 如何制作一个合适的404页面?

apache - 如何使用 .htaccess 拒绝除一个目录名称以外的所有目录名称?

php - Codeigniter URL 重写

asp.net - IIS URL 重写 - 具有多个域