【问题标题】:Unable to allow these characters in URL:- % / \ # +无法在 URL 中允许这些字符:- % / \ # +
【发布时间】:2011-03-14 18:09:17
【问题描述】:

关于系统

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

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

其中keyword/class 对表示使用“类”关键字进行搜索。

以下是我的 htaccess 文件:-

##AddHandler application/x-httpd-php5 .php

Options Includes +ExecCGI
Options +FollowSymLinks

<IfModule mod_rewrite.c>
RewriteEngine on

############To remove index.php from URL

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
#################################################end of find a class 


</IfModule>

我有一个为项目中的每个模块执行的通用 index.php 文件。 只有一个重写规则可以从 URL 中删除 index.php(如上所示)。

我没有使用任何 htaccess 重写规则来定义 $_GET 数组。我在 PHP 中有一个 URL 解析器函数来代替它。对于我给出的示例 URL,解析器返回:-

Array ( [a] => browse_by_exam [type] => tutor_search [keyword] => class [new_search] => 1 [search_exam] => 0 [search_subject] => 0 )

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

问题

我遇到了 URL 中某些字符的问题

Character               Response
%                       400 - Bad Request - Your browser sent a request that this server could not understand.
/                       404 - Not FOund
\ # +                   Page does not break but urldecode() removes these characters.

我想允许所有这些字符。 可能是什么问题呢?我如何允许这些? 请帮忙 谢谢, 桑迪潘

更新

现在只有 / 字符会导致 URL 中断(像以前一样的 404 错误)。因此,我尝试删除隐藏在 URL 中的 index.php 的 htaccess 重写规则,并尝试使用完整的 URL。对于搜索词class/new,我尝试了以下两个网址:-

http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/class%2Fnew/new_search/1/search_exam/0/search_subject/0

http://project_name/index.php/browse_by_exam/type/tutor_search/keyword/class%2Fnew/new_search/1/search_exam/0/search_subject/0

第一个有效,第二个无效。请注意第一个中的index.php?browse_by_exam

但我不能使用第一个 URL 约定。我必须隐藏 / 使用 index.php。请帮忙

再次感谢 桑迪潘

编辑(已解决)

考虑 Bobince 对我其他问题的回答

urlencoded Forward slash is breaking URL ,我觉得最好有这样的网址:- http://project_name/browse_by_exam?type/tutor_search/keyword/class %2Fnew/new_search/1/search_exam/0/search_subject/0

这样我就摆脱了&amp;param1=value1&amp;param2=value2约定造成的可读性困难,并且还可以使用?在查询字符串部分允许正斜杠

我想避免 AllowEncodedSlashes,因为 Bobince 说 Also some tools or spiders might get confused by it. Although %2F to mean / in a path part is correct as per the standard, most of the web avoids it.

【问题讨论】:

    标签: url .htaccess url-routing url-encoding


    【解决方案1】:

    有些问题听起来与您尝试使用PATH_INFO 有关(您的RewriteRule 将所有内容都粘贴在index.php 后面,就好像它是一条路径一样)。是否可以只使用 $_SERVER['REQUEST_URI'] 变量作为 URL 解析器函数的输入?它包含相同的信息,我觉得它会少一些问题。

    尝试创建 PATH_INFO 解决方案在 per-dir (.htaccess) 上下文中似乎效果不佳。您可以设置AllowPathInfo On,但是一旦mod_rewrite 尝试在内部重定向 URL,Apache 似乎不想解析 URL 的尾随部分,这会导致 404 错误。

    如果您改用$_SERVER['REQUEST_URI'],那么您可以直接重写为index.php,而不需要尾随信息,如下所示:

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

    就 400 错误而言,您的 % 应由 urlencode() 编码为 %25,但无论出于何种原因,这听起来都可能存在问题。我会检查以确保您的搜索 URL 确实在发送到浏览器的输出中正确编码,因为这也可能与其他剩余字符的问题有关(但我不确定)。

    编辑:如果你使用上面的重写,你会有类似的网址

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

    它们会在内部被重定向到index.php。然后,你可以得到零件

    /browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0
    

    来自该脚本中的$_SERVER['REQUEST_URI'](它将包含此值),然后您可以像现在一样对其进行解析。我不确定为什么您必须能够在index.php 之后重写它,因为即使不是,您也可以获得此信息,并且在用户的浏览器中看起来完全一样。如果使用 $_SERVER['PATH_INFO'] 的部分无法更改,您甚至可以在脚本开头执行此操作:

    $_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
    

    如果你真的不能这样做,我不确定是否有解决方案(在你的另一个问题中解释了为什么这是有问题的),但我会看看它是否在尽一切可能与您联系。

    【讨论】:

    • 非常感谢蒂姆,这立即解决了 % 字符问题。我进一步更正了我的代码,这样所有其他字符都不会被删除。但是 / 字符仍然像以前一样破坏我的 URL(404 错误)。请查看更新部分,看看您是否可以提供帮助。
    • 我对我的回答做了一些更新;它不能解决您描述的问题,但我不明白为什么必须按照您描述的方式完成。不过,我会看看是否有办法让它像你想要的那样工作,但我不确定它是否可能(除非你将重写规则移动到 httpd.conf 或其他地方,它似乎可以正常工作)。
    • 我想隐藏 index.php,就像它一直在我们的项目中一样。我想这隐藏了编码完成的语言信息(在我的例子中是 php)。检查我编辑的问题非常感谢您的帮助态度谢谢,Sandeepan
    • 哦,我明白了。使用我建议的方法,您仍然可以将index.php 保留在 URL 之外。更改为 index.php 发生在服务器上,在浏览器中看到 URL 的用户根本不应该知道发生了这种情况,因此如果您修改如何完成它仍然保持您的 URL 相同(您只是明白了来自 PHP 脚本中不同位置的 URL 数据)。如果您愿意,我可以尝试更清楚地解释,或者如果您对当前的解决方案感到满意,我很高兴看到您能够让它发挥作用。
    • 请说明您是否认为可以做得更好...我们应该始终努力获得最佳解决方案,为 Sandeepan 欢呼
    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2010-12-09
    • 1970-01-01
    • 2022-01-21
    • 2014-11-23
    相关资源
    最近更新 更多