我最近在我的Apache实例中遇到了一个非常奇怪的问题,我似乎找不到答案,我可能在错误的地方找了东西。
对于我的网站,我始终通过index.php
运行所有请求(所有其他内容JS / CSS / PNG都通过单独的CDN),因此我使用.htaccess
重定向 all < / em>这样的请求
SetEnv SERVER_ADMIN admin@example.com
SetEnv PHPRC /home/user
ServerSignature email
AddDefaultCharset UTF-8
DefaultLanguage en-US
# Enable Rewriting
RewriteEngine on
RewriteBase /
Options +FollowSymlinks
Options All -Indexes
# Do not redirect these directories
RewriteRule sitemap.xml - [L]
RewriteRule robots.txt - [L]
# Redirect to index
RewriteCond %{REQUEST_URI} !=/index.php
RewriteRule ^.*$ index.php [L]
我读取了$_SERVER
变量$_SERVER['REQUEST_URI']
我最近遇到一个问题,当我尝试将任何REQUEST_METHOD
发送到我的Web服务器时,请求变成了GET
,但是 仅当 我的URL包含转义的/
(%2F
)。在调试此问题时,我print_r
的{{1}}变量可以找到以下内容:
$_SERVER
的{{1}}请求(请注意,这不是尾随DELETE
的问题,无论URL中的位置如何,都会发生此问题,并且我也不会在代码中转义它)
example.com/%2F
/
的{{1}}请求{
"REDIRECT_REDIRECT_REDIRECT_REQUEST_METHOD": "DELETE",
"REDIRECT_REDIRECT_REDIRECT_STATUS": "200",
"REDIRECT_REDIRECT_SERVER_ADMIN": "admin@example.com",
"REDIRECT_REDIRECT_PHPRC": "/home/user",
"REDIRECT_REDIRECT_HTTPS": "on",
"REDIRECT_REDIRECT_SSL_TLS_SNI": "www.example.com",
"REDIRECT_REDIRECT_STATUS": "200",
"REDIRECT_HTTP_AUTHORIZATION": "",
"REDIRECT_SERVER_ADMIN": "admin@example.com",
"REDIRECT_PHPRC": "/home/user",
"REDIRECT_HTTPS": "on",
"REDIRECT_SSL_TLS_SNI": "www.example.com",
"REDIRECT_STATUS": "200",
"HTTPS": "on",
"SSL_TLS_SNI": "www.example.com",
"HTTP_HOST": "www.example.com",
"REQUEST_METHOD": "GET",
"REQUEST_URI": "/%2F",
"SCRIPT_NAME": "/index.php"
}
我还没有找到为什么这个转义的符号会引起额外的重定向,以及为什么它改变了请求方法。 I came across one suggestion on SO将我的DELETE
替换为example.com
来代理请求,但这仅引起错误。 RewriteRule Flags documentation声明代理规则应与外部URL一起使用。
任何建议和/或帮助将不胜感激。
答案 0 :(得分:0)
最后,通过进一步研究StackOverflow解决了该问题。
第一个想法只是阅读$_SERVER['REDIRECT_REDIRECT_METHOD']
,但我不建议这样做,因为事实证明,Apache在重定向期间也强制使用404
响应代码,表示所有编码为%2F
的URL都以未找到的形式返回(即使显示了我的页面内容)。
答案来自this other question。
# Set this rule in .htaccess/httpd.conf
AllowEncodedSlashes NoDecode