【问题标题】:htaccess rewrite rule, parameter with unicode lettershtaccess 重写规则,带 unicode 字母的参数
【发布时间】:2017-05-19 08:41:25
【问题描述】:

我尝试在网站上关注许多答案,但没有成功。 我正在尝试重写:

domain.com/articles/<author>

收件人:

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

我目前的规则是:

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

这适用于字母或数字,但不适用于 א" 等 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 操作系统下,带有 " 字符的地址似乎被视为非法文件,尽管该地址根本不是文件。 所以我暂时放弃了 " 案子。很高兴听到是否有办法解决这个问题。

【问题讨论】:

  • 你需要这么具体,你能匹配everything ie。 (.*)?
  • @user82217:我试过了。然后我得到:“内部服务器错误”。
  • 刚刚测试了这个场景。它确实有效,但仅在虚拟主机非目录上下文中有效。将您的规则放在 &lt;VirtualHost&gt; 中,您将获得所有这些 un​​icode 和双引号。
  • RewriteRule ^/articles/(?!index\.php)(.*)$ /articles/index.php?author=$1 [END]
  • @Deadooshka 只能用 .htaccess 文件吗?

标签: apache .htaccess mod-rewrite unicode


【解决方案1】:
RewriteRule ^(\w*)$ /articles/index.php?author=$1 [B]

如果您只是用(.*) 替换您的模式,那么您将得到一个重写循环(这是您的 500 Internal Server Error)。您可以让RewriteRule pattern 匹配所有内容除了斜杠

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

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

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

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

但是 " 的情况下仍然给出相同的错误(禁止访问)。

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

【讨论】:

  • 谢谢! [但是:] (1) .htaccess 文件位于 /articles 目录中。 (2)您的第一个选项在所有情况下都导致“Internal Server Error The server遇到内部错误或配置错误,无法完成您的请求”:字母/数字/א/”(3)您的第二个选项导致:“对象不是成立!在此服务器上找不到请求的 URL...” (4) 添加我省略的 B 标志会给出“服务器错误!服务器遇到内部错误,无法完成您的请求。服务器过载或 CGI 脚本出错。”
  • 为了找到错误的详细信息,您需要检查错误日志。
  • 您的第一个选项的 (RewriteRule ([^/]*) /articles/index.php?author=$1 [B,L]) 日志是“请求超出了 10 个内部重定向的限制,因为可能配置错误”
  • (RewriteCond %{QUERY_STRING} ^$ RewriteRule (.*) /articles/index.php?author=$1 [B,L]) 导致“找不到对象!”不会在日志中产生记录。
  • 也感谢您的日志建议,我正在添加有关“案例”的日志作为对我的问题的编辑。
【解决方案2】:

对于双引号问题: " 字符不是@MrWhite 所说的有效文件名字符。

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

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

所以解决方案是将重写规则放在 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 >>>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2018-02-03
    • 2013-12-26
    相关资源
    最近更新 更多