Apache重写规则以规范大小写

时间:2018-10-23 13:25:36

标签: .htaccess mod-rewrite

我在服务器上运行可通过网络访问的语言数据库。我服务器的文档根目录中的文件lexirumah包含一个为该应用程序提供服务的WSGI python脚本。

我希望该应用程序在http://www\.example\.eu/lexirumah?/?的所有匹配项中均可使用,无论大小写如何。当前,我正在使用以下.htaccess文件。

RewriteEngine On

RewriteCond %{HTTP_HOST} !^www.example.eu$ [NC]
RewriteRule ^(.*)$ http://www.example.eu/$1 [L,R=301,NC]

RewriteRule ^lexirumah?$ http://www.example.eu/lexirumah/ [L,R=301,NC]
RewriteRule ^lexiruma/$ http://www.example.eu/lexirumah/ [L,R=301,NC]
RewriteRule ^LexiRumah/$ http://www.example.eu/lexirumah/ [L,R=301]

Options +ExecCGI
<Files "lexirumah">
SetHandler fcgid-script
</Files>

当我将最后一个RewriteRule更改为

RewriteRule ^LexiRumah/$ http://www.example.eu/lexirumah/ [L,R=301,NC]

我得到的重定向次数是无限的。我想保留非规范网址的301状态,所以我尝试了

RewriteRule ^lexirumah/$ http://www.example.eu/lexirumah/ [L]
RewriteRule ^lexirumah?$ http://www.example.eu/lexirumah/ [L,R=301,NC]
RewriteRule ^lexiruma/$ http://www.example.eu/lexirumah/ [L,R=301,NC]
RewriteRule ^LexiRumah/$ http://www.example.eu/lexirumah/ [L,R=301,NC]

导致内部服务器错误。 (大概是以前由我的浏览器捕获的无限重定向循环现在发生在mod_rewrite内部?)

现在,我已经更改了规则,以使用RewriteCond来跳过大小写已标准化的情况。

RewriteCond %{REQUEST_URI} !^/lexirumah/$
RewriteRule ^LexiRumah/$ http://www.example.eu/lexirumah/ [L,R=301,NC]

RewriteRule ^lexirumah?$ http://www.example.eu/lexirumah/ [L,R=301,NC]
RewriteRule ^lexiruma/$ http://www.example.eu/lexirumah/ [L,R=301,NC]

这套规则是我想要的吗,还是我需要考虑任何隐藏的陷阱?

1 个答案:

答案 0 :(得分:0)

简短回答

是的,您的规则集符合您的期望

但是请注意,您可以在前^lexirulah/$中使用RewriteRule,因为其中包含了NC标志。结果,匹配将不区分大小写(No Case)。可以here找到NC标志的官方文档。

此外,您不需要完整的URL(包括主机)进行重定向。您可以为每个规则直接使用RewriteRule ^xxxx$ /lexirumah/ [L,R=301,NC]

您的第一个问题

  

当我将最后一个RewriteRule更改为

RewriteRule ^LexiRumah/$ http://www.example.eu/lexirumah/ [L,R=301,NC]
     

我得到的重定向次数是无限的。

考虑一下,很容易理解为什么会陷入无限循环。由于NC在不区分大小写的模式下匹配,因此您的重定向将始终一次与您的规则匹配。