我需要向我的网络服务器发送一些参数,其中包含特殊字符,例如< *>进入网址。
例如:
http://localhost/mypage/X123*12362issasa.
这个特殊字符我会将它用于一些正则表达式。
当我尝试这个时,我得到了这个
“403禁止您无权访问 /我的空间/ X123 * 12362issasa。在这台服务器上。“
apache_error.log包含以下行:
[error] [client 127.0.0.1](20025)给定路径包含通配符 字符:访问/ mypage / X123 * 12362issasa失败
我的.htaccess包含以下行:
Options +ExecCGI
AddHandler cgi-script .cgi .pl .py .php
DirectoryIndex mypage.pl
<IfModule mod_charset.c>
CharsetRecodeMultipartForms off
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ mypage.pl?oid=$1
</IfModule>
有人可以帮我正确配置.htaccess文件以接受这种特殊字符吗? 任何帮助都会被贬低。 感谢。
答案 0 :(得分:3)
您不应在网址中使用星号的原因。
1)根据标准未编码的URL中允许使用星号 ,但根据RFC 1738 Uniform Resource Locators (URL),它是一个特殊字符。所以在这种情况下它有特殊用途。
RFC 1738统一资源定位器(URL)1994年12月
保留:
许多URL方案为特殊含义保留某些字符: 它们在URL的特定于方案的部分中的出现有一个 指定的语义。如果对应于八位字节的字符是 在方案中保留,八位字节必须被编码。人物&#34;;&#34;, &#34; /&#34;,&#34;?&#34;,&#34;:&#34;,&#34; @&#34;,&#34; =&#34;和&#34;&amp;&#34;是可能的人物 保留给计划中的特殊含义。没有其他角色可以 在计划中保留。
通常,当八位字节为时,URL具有相同的解释 由字符表示并在编码时。但事实并非如此 保留字符为true:编码为a保留的字符 特定方案可能会改变URL的语义。
因此,只有字母数字,特殊字符&#34; $ -_。+!*&#39;(),&#34;和 可以使用用于其保留目的的保留字符 在URL中未编码。
另一方面,不需要编码的字符 (包括字母数字)可以在特定方案内编码 URL的一部分,只要它们不用于保留 目的
此外,在标题中,它根据RFC 2068 HTTP 1.1用于仅服务器声明。
9.2选项
OPTIONS方法表示有关的信息请求 请求/响应链上可用的通信选项 由Request-URI标识。这种方法允许客户端 确定与资源相关的选项和/或要求, 或服务器的功能,而不暗示资源操作 或启动资源检索。
除非服务器的响应是错误,否则响应不得 包括除可以被视为之外的实体信息 通信选项(例如,允许是合适的,但内容类型 不是)。对此方法的响应无法缓存。
如果Request-URI是星号(&#34; *&#34;),OPTIONS请求是 旨在作为一个整体应用于服务器。 200响应应该 包括指示可选功能的任何标题字段 由服务器(例如,公共)实现,包括任何扩展 除了任何适用的以外,本规范未定义 general或response-header字段。如5.1.2节所述, &#34; OPTIONS *&#34;可以通过指定来通过代理应用请求 Request-URI中的目标服务器,没有任何路径信息。
如果Request-URI不是星号,则OPTIONS请求适用 仅限于与之通信时可用的选项 资源。 200响应应该包括任何标题字段 表示服务器实施并适用的可选功能 到该资源(例如,允许),包括未定义的任何扩展 除本规范外,任何适用的一般或 响应标头字段。如果OPTIONS请求通过a 代理,代理必须编辑响应以排除这些选项 适用于代理的功能,以及已知的功能 通过该代理无法使用。
2)它是RFC 3986 URI Generic Syntax January 2005的保留字符(子分隔符)(感谢@Daxim指出这一点)。
2.2。保留字符
URI包括由
分隔的组件和子组件 &#34;保留&#34;中的字符组。这些字符称为
&#34;保留&#34;因为他们可能(或可能不会)被定义为分隔符 通用语法,每种方案特定的语法,或由 URI的解除引用算法的特定于实现的语法 如果URI组件的数据与保留的数据发生冲突 字符作为分隔符的目的,那么冲突的数据必须是 在URI形成之前进行百分比编码。reserved = gen-delims / sub-delims
gen-delims =&#34;:&#34; /&#34; /&#34; /&#34;?&#34; /&#34;#&#34; /&#34; [&#34; /&#34;]&#34; /&#34; @&#34;
sub-delims =&#34;!&#34; /&#34; $&#34; /&#34;&amp;&#34; /&#34;&#39;&#34; /&#34;(&#34; /&#34;)&#34; /&#34; *&#34; /&#34; +&#34; /&#34;,&#34; /&#34;;&#34; /&#34; =&#34;
保留字符的目的是提供一组 分隔与其他数据可区分的字符 在URI中。替换保留的URI不同的URI 具有相应的百分比编码八位字节的字符不是 当量。百分比 - 编码保留字符或解码 与保留字符对应的百分比编码八位字节, 将改变大多数应用程序解释URI的方式。从而, 保留集中的字符不受规范化和 因此,特定计划和安全使用是安全的 用于分隔数据子组件的特定于生产者的算法 在URI中。
3)在某些主机操作系统中,它被用作通配符。
无论哪种方式,都应该避免在请求URI中使用未编码的星号。