我很想在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]标志,这显然行不通。
答案 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并明确地打开您希望默认打开的功能