Ken*_*uys 7 apache mod-rewrite http
我有一个包含以下内容的网址:
/somepath/morestuff/ohno%25foobar
Run Code Online (Sandbox Code Playgroud)
出于某种原因,apache报告了400个错误请求(它与%25有关).我使用mod_rewrite重写路径指向我的codeigniter实例,但它甚至没有得到codeigniter,它只是默认的apache错误.
有任何想法吗?
Tim*_*one 12
我怀疑你是PATH_INFO
用来处理你的CodeIgniter请求.因此,您的.htaccess
文件包含一个类似于以下内容的规则集:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php/$0 [L]
Run Code Online (Sandbox Code Playgroud)
在mod_rewrite
测试您的URL时,它们已经被解码为它们的自然字符格式,所以在这种情况下%25
变得公正%
.应用此规则时,反向引用实际上包含文本文本somepath/morestuff/ohno%foobar
,默认情况下不会重新编码.Apache不知道%
在你的请求路径/index.php/somepath/morestuff/ohno%foobar
和chokes中做了什么,给你这个错误.
如果你正在运行Apache 2.2,为此目的mod_rewrite
添加了B
标志,允许你自动转义重写到你的URL的反向引用.将其添加到当前标志列表应解决此问题:
RewriteRule ^.*$ index.php/$0 [B,L]
Run Code Online (Sandbox Code Playgroud)
还有一个escape
RewriteMap
可用作以前Apache版本的内部地图mod_rewrite
,但不幸的是,这个地图必须在服务器或虚拟服务器配置级别启用,因此如果您在共享主机上运行您的站点,则可能无法使用.它做了同样的事情,虽然有点故意.
在您的服务器/虚拟服务器配置中:
RewriteMap escape int:escape
Run Code Online (Sandbox Code Playgroud)
然后,无论您在何处定义规则:
RewriteRule ^.*$ index.php/${escape:$0} [L]
Run Code Online (Sandbox Code Playgroud)
请记住,CodeIgniter不需要PATH_INFO
用来获取请求信息,REQUEST_URI
如果您不使用mod_rewrite
任何其他转换(并且完全避免这种麻烦),那么使用它是完全可以接受的.我认为默认情况下,CodeIgniter设置为从中获取请求AUTO
(假设我没有将我的框架混淆),因此只是不用路径信息重写对URL的请求就足以进行更改.
归档时间: |
|
查看次数: |
21820 次 |
最近记录: |