我正在尝试使用.htaccess
从URL中删除百分号。在网址末尾添加%
时,我得到请求代码400。
这是我的.htaccess
代码:
# NON-WWW HTTPS
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
### NO SLASH ON URL END
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
### FORCE TO LOAD EXISTING FILES
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
### URL AS MAIN STRING
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
我在htaccess to escape percent (%) from URL处找到了一些相似的解决方案,但对我而言不起作用。
当我在最后添加一行时:
RewriteRule .* index.php?url=$1 [PT,B]
.htaccess
没有加载任何外部文件,例如CSS和图像。
答案 0 :(得分:1)
在网址末尾添加
%
时,我得到请求代码400。
Apache 之前 .htaccess
/ mod_rewrite能够处理URL触发了400个“错误请求”。由于URL中的任意%
是完全无效的URL(它本身必须被%编码为%25
)。
如果您特别需要更正这些URL,则可以创建一个自定义400 ErrorDocument
,然后在该错误文档中(在PHP中)检查所请求的%
的URL,将其删除并重定向。
例如,在您的.htaccess
文件的顶部:
ErrorDocument 400 /errdocs/e404.php
然后在/errdocs/e404.php
中,您可以为任意{{1}检查$_SERVER['REDIRECT_URL']
变量(以及可选的$_SERVER['REDIRECT_QUERY_STRING']
-取决于您要在%
中检查的URL中的位置) }}和301重定向(覆盖400状态)。
例如,在您的%
错误文档中:
e404.php
如上面的代码注释中所述,即使正确编码,这也会删除保留在URL路径中的任何 // Since the REDIRECT_URL value is already %-decoded we can simply remove
// any remaining "%" if none are meant to be in the URL (even if correctly encoded as %25)
if (strstr($_SERVER['REDIRECT_URL'], '%')) {
$cleanUrl = str_replace('%', '', $_SERVER['REDIRECT_URL']);
// Append back the query string (if any)
if (isset($_SERVER['REDIRECT_QUERY_STRING'])) {
$cleanUrl .= '?'.$_SERVER['REDIRECT_QUERY_STRING'];
}
// Redirect to clean URL
header('Location: http://'.$_SERVER['HTTP_HOST'].$cleanUrl,true,302);
exit;
}
。目前,该操作不会检查查询字符串,但是您可以根据需要对%
应用相同的过程。
使用302(临时)重定向进行测试,只有在确定其工作正常时,才将其更改为301(永久)。