htaccess从网址字符串中删除百分比

时间:2018-09-20 09:18:42

标签: php .htaccess

我正在尝试使用.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和图像。

1 个答案:

答案 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(永久)。