- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 apache/mod_rewrite 来重写 URL,但我遇到了加号问题。
遵循以下规则..
RewriteRule ^/(.+[^/])/?$ http://localhost:8080/app/home?tag=$1 [P,L]
两者:
http://localhost/1+1 and http://localhost/1%2B2
最终成为
uri=http://localhost:8080/app/home, args=tag=1+2
因此,在这两种情况下,应用程序都会将加号转换为空格,因此它无法再区分空格和加号。
如果我使用“B”标志,那么在这两种情况下,+ 号都会转换为 %2B,并且应用程序最终会遇到相同的问题,但情况相反(空格和加号都是加号)
有没有办法让 apache 将 %2B 正确转义为加号而不是空格?
我读过一些有关 mod_security 的内容,但我没有使用它,所以我不确定是否有其他安全机制导致了这种情况?
任何帮助将不胜感激!
最佳答案
不,这与引用的问题不太一样。这里的问题具体是加号和 Apache: mod_rewrite: Spcaes & Special Characters in URL not working 的答案。没有解决这个问题。
斜杠也存在问题,请参阅 http://httpd.apache.org/docs/current/mod/core.html#allowencodedslashes(但您确实需要访问 Apache 配置才能执行此操作 - .htaccess 不会这样做)。
事实上,单独使用重写规则是不可能的。 Apache 在重写之前对 URL 进行解码,但是它不理解加号: http://example.com/a+b.html不会传送名为
的文件"a b.html".
加号由 PHP 解码为查询字符串的 $_GET 数组(或任何相关的语言机制),因为浏览器中的表单处理程序将它们放入其中。因此 Apache 在应用重写之前会将 %2B 转换为 +,并保留 + 本身,这意味着您无法区分。
当然,有人可能会争辩说,在此类 URL 中将 + 用作空格根本无效,应该仅使用 %20。但是,如果您无法控制它们的生成,那么您一定会看到它们。但浏览器不会自动生成它们。
答案是 DIY,在很多方面它更可预测且更简单:
RewriteRule .* index.php [L]
因此,所有内容都会变成index.php,并且不会尝试构造查询字符串。如果您想排除某些模式,例如那些带有斜杠的,或者确实存在明确文件的地方,适用明显的修改。例如RewriteCond %{REQUEST_FILENAME} !-f
然后在index.php
$uri = substr($_SERVER['REQUEST_URI'], 1); // remove leading slash
$qmpos = strpos($uri, '?'); // is there a question mark, if so where
if ($qmpos !== FALSE) { $uri = substr($uri, 0, $qmpos); } // only the bit before q.m.
$decoded = urldecode($uri); // decode the part before the URL
if (! empty($decoded)) { $_GET['args'] = $decoded; } // add result to $_GET
解码原始请求(不包括前导斜杠 - 如果您位于层次结构的更深处,情况会略有不同,但原理是相同的 - 并且不包括任何其他查询字符串),并且根据 PHP 的正常规则解码 args 参数并将其放入 $_GET 中,以便您可以以通常的方式将其与其余 $_GET 查询字符串参数一起处理。
我相信这应该适用于空 URL ( http://example.com/ ) 或只有查询字符串 ( http://example.com/?foo=1 ) 的 URL,以及简单情况 ( http://example.com/bar ) 和带有查询字符串的情况(http://example.com/bar?foo=1)。毫无疑问,类似的方法也适用于其他语言。
在您的特定情况下,您实际上根本不希望在 PHP 中对加号进行解码。没关系,使用 rawurldecode 代替,这没有好处。
关于Apache mod_rewrite %2B 和加号 (+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2523506/
我在这里寻求帮助。我正在尝试将 lighttpd mod_rewrite 转换为 apache mod_rewrite 在这里。轻型服务器 url.rewrite-once = ( "/tor
快速一: 我很好奇是否有人知道在某些情况下 $_SERVER['REQUEST_URI']将包含与 $_GET['_uri'] 不同的值,给定以下 .htaccess对于后者: RewriteCond
.htaccess mod_rewrite 是否需要以下打开/关闭标签?我已经让 .htaccess 在没有这些的情况下工作,但只是检查了 htaccess 教程,很多都包含这个标签。 ... 最
我正在尝试对我的电子商务网站进行一些改进,以获得更好的搜索引擎优化。更重要的事情之一是将产品设置为不使用旧的: /detail.php?pid=367 相反,我们设置了 8 个顶级类别,在 8 个顶级
我正在从 Apache 中的 Django FastCgi 设置迁移到 lighttpd 中的设置。 在 Apache 上,我使用 Django 文档中描述的 fcgi 配置。核心部分是将我所有的非静
我是 mod_rewrite 的新手,我正在尝试将我的网址转换为: website.com/profile.php?user=andy 到以下几点: website.com/user/andy 这是我
我正在使用在 tomcat 上运行的 Liferay 6.2 EE,但它的前端是 Apache 服务器。我想重定向用户,以便每当他们点击旧的 liferay URL 时,它就会将他们重定向到新的 li
好的,我正在测试安装在我的个人网络服务器上的 cms(joomla),然后再将其上线。 而且我希望能够阻止使用查询字符串,或者更重要的是阻止用户在查询字符串上输入内容(如 articleid 等更改)
我正在尝试将每个请求发送到 www.example.com/user/至 www.example.com/user.php?id=0使用这个 RewriteRule ^user/$ user.php?
我打算将我的网站转换为新的 CMS,但我想使用 mod_rewrite 将旧链接无缝重定向到新位置。 问题是我的新博客的文章编号与旧的不同,因为我将首先导入一些较旧的博客条目。因此,我的 mod_re
我已与我的主机确认启用了 mod_rewrite。我希望传入的请求被重写以传递到我的根目录中的 mod_rewrite.php 文件。 Mod_rewrite 似乎根本不起作用。这是我的 .htacc
我想重写 URL,以便当有人访问时: url.com/directory1/directory2 他在浏览器地址栏中看到了 URL,但实际上下面的 URL 显示的是文本 url.com/index.p
所以我试图让 mod_rewrite 工作,在 Windows 7 上使用 Apache2.2我将它作为本地服务器运行。所有网站都可以通过 http://localhost/ 访问没用? 我创建了一个
我想使用 Apache 的 mod_rewrite为了能够将路径的每个文件夹作为特定的查询参数,例如考虑以下内容: 基本示例 请求的网址:http://domain.com/shoes/prada/i
我有这个地址http://www.example.com并拥有此页面 http://www.example.com/world . 我可以用 mod_rewrite 做到这一点吗,我的页面变成 htt
我的情况是我需要将所有匹配 http://mywebsite.com/portfolio/[anyname] 的请求定向到 http://mywebsite.com/portfolio.php?用户名
我试图让 Symfony1.4 和 Symfony2 在 Apache(2.2.22)中的同一主机上工作 - 我认为问题在于两者都使用 mod_rewrite 将请求定向到 php Controlle
是否可以使用 mod_rewrite 将内部重定向(因此地址栏中的 url 不会更改)到同一主机上的不同端口? 例如 http://host.com:8080 -> http://host.com:9
我已经为此工作了几个星期。我希望能够使用友好的 URL 将变量传递给 PHP 脚本。例如,如果有人使用此 URL: https://example.com/foo/bar/who 我希望我的 PHP
我需要使用以下 URL 重定向传入请求: http://mywebsite.com/abc/mapserv.exe?map=123 到 http://mywebsite.com/abc/mapserv
我是一名优秀的程序员,十分优秀!