.htaccess mod_rewrite,未编码路径有效时,编码网址路径无效

时间:2018-08-12 16:02:16

标签: apache .htaccess mod-rewrite

我很想在apache上使用mod_rewrite,我目前正在尝试编写一个URL缩短器,该URL缩短器使用类似mydomain/s/short/{UriToShorten}的URL并缩短给定的URI。

会发生什么
当我将URI传递到浏览器中的缩短路径时,例如localhost/s/short/http://example.com,将调用脚本shorting.php,缩短过程将按预期进行。但是,如果我对URL组件进行编码并传递localhost/s/short/http%3A%2F%2Fexample.com之类的URI(应该正确使用),则会收到消息

  

未找到
  在此服务器上找不到请求的URL / s / short / http://example.com

并且调试表明,shortening.php或index.php均未运行(因此,我相信服务器确实尝试搜索http:的子目录short)。这似乎是在斜杠编码%2F所在的地方独立发生的。


期待什么
我希望编码版本能正常工作,并且未编码的URI可能会导致错误(因为专门进行了URL编码以避免这些错误)。

我使用的是
我将以下内容用作.htaccess:

RewriteEngine On
RewriteBase /s/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^short/(.*)$ shorten.php?url=$1 [L,NC]
RewriteRule ^([a-z0-9]{5})$ index.php?slug=$1 [L,NC]

我的文件夹结构是:

-www
  -s
    -.htaccess
    -shorten.php
    -index.php

而我的Apache版本是Apache/2.4.33

我尝试过的事情
由于我不知道为什么会发生这种情况,所以我只能搜索mod_rewrite文档并尝试添加[NE]标志,这显然行不通。

2 个答案:

答案 0 :(得分:1)

发生这种情况是因为 Apache 默认阻止编码的斜杠。从 Apache 2 开始,可以允许它们: https://httpd.apache.org/docs/2.4/mod/core.html#allowencodedslashes

但是,设置 AllowEncodedSlashes On 时要小心。这是 Apache 制定的安全措施。

<块引用>

如果路径信息中需要编码斜杠,强烈建议使用 NoDecode 作为安全措施。允许解码斜杠可能会允许不安全的路径。

如果要启用编码斜杠,请改用 AllowEncodedSlashes NoDecode。例如:

<VirtualHost *:80>
  [...]

  AllowEncodedSlashes NoDecode

</VirtualHost>

答案 1 :(得分:0)

好的,我发现了导致问题的原因:

并不是每个编码的url字符都发生错误,但是总是在URL包含%2F时发生。所以我的问题似乎是Active Directory Plugin

我需要在AllowEncodedSlashes NoDecode中设置httpd.conf(或设置为ON),并在httpd-vhosts.conf中设置,以使其正常工作。

经验教训:始终检查httpd.conf-features并明确地打开您希望默认打开的功能