htaccess重写规则,带有unicode字母的参数

问题描述 投票:1回答:2

我试图在网站上关注很多答案,但没有成功。我想改写:

domain.com/articles/<author>

至:

domain.com/articles/index.php?author=<author>

我目前的规则是:

RewriteRule ^(\w*)$ /articles/index.php?author=$1 [B]

这适用于字母或数字,但不适用于像א和“un”这样的unicode字符。

对于א,我收到以下错误:

找不到对象!

在此服务器上找不到请求的URL。如果您手动输入了URL,请检查拼写,然后重试。

如果您认为这是服务器错误,请与网站管理员联系。

错误404

localhost Apache / 2.4.23(Win32)OpenSSL / 1.0.2h PHP / 7.0.9

对于“:

访问被禁止!

您无权访问请求的对象。它受读保护或服务器无法读取。

如果您认为这是服务器错误,请与网站管理员联系。

错误403

localhost Apache / 2.4.23(Win32)OpenSSL / 1.0.2h PHP / 7.0.9

我需要他们两个。

编辑:

在阅读@ user82217评论之后我再次尝试(。*)正则表达式,这次使用END标志,如下所示:

RewriteRule (.*) /articles/index.php?author=$1 [END]

现在א案件得到了很好的解释。但“案例仍然给出了相同的错误(Access Forbidden)。

@ user82217建议调查日志。对于“案例日志是:

无法将GET / articles /%22 HTTP / 1.1映射到文件

结论:

正如@ user82217在评论中所说的那样,在Windows操作系统下,“char被认为是非法文件服务的地址,虽然地址根本不是文件。所以我现在放弃了”。很高兴听到是否有办法解决这个问题。

apache .htaccess mod-rewrite unicode
2个回答
2
投票
RewriteRule ^(\w*)$ /articles/index.php?author=$1 [B]

如果你只是用(.*)替换你的模式,那么你将得到一个重写循环(这是你的500内部服务器错误)。您可以使RewriteRule模式匹配除斜线之外的所有内容:

RewriteRule ^([^/]*)$ /articles/index.php?author=$1 [B,L]

但是,从您的示例中,您不清楚.htaccess文件的位置。以上假设它位于/articles子目录中。

或者,您可以检查查询字符串,并仅在查询字符串为空时处理该指令:

RewriteCond %{QUERY_STRING} ^$
RewriteRule (.*) /articles/index.php?author=$1 [B,L]

但“案例仍然给出了相同的错误(Access Forbidden)。

更新:啊,这可能是一个更基本的错误,可能是操作系统的限制(你使用的是Windows吗?)。 "字符不是有效的文件名字符。 Apache无法将此映射到有效的文件名,该文件名似乎会导致系统生成403 Forbidden。


0
投票

对于双引号问题:“字符不是像@MrWhite那样的有效文件名字符。

@Deadooshka在他的评论中说,它不能在.htaccess上下文中完成。我认为他是对的。

@Deadooshka还说它可以在<] VirtualHost [>上下文中完成。但是,在我的开发服务器中,我不使用<] VirtualHost [>上下文。

因此解决方案是将重写规则放在Apache的配置文件的全局上下文中(在我的例子中:C:\ xampp \ apache \ conf \ httpd.conf),如下所示:

# <<< existing line >>>
DocumentRoot "C:/xampp/htdocs"
# <<< existing line >>>
# <<< solution >>>
RewriteEngine on
RewriteRule /articles/(\w*)$ /articles/index.php?author=$1 [B]
# <<< solution >>>
© www.soinside.com 2019 - 2024. All rights reserved.