.htaccess不区分大小写的目录

时间:2016-10-10 18:13:14

标签: regex apache .htaccess mod-rewrite case-insensitive

我访问file.php撰写mydomain.com/file。我还需要能够访问mydomain.com/FILE

在.htaccess中,我使用以下规则删除扩展名:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ /$1.php [L]

# redirect to .php-less link if requested directly
RewriteCond %{THE_REQUEST} ^[A-Z]+\s.+\.php\sHTTP/.+
RewriteRule ^(.+)\.php $1 [R=301,L]

如果应该更改此规则,则由您决定。

3 个答案:

答案 0 :(得分:2)

在Apache或RewriteMap config:

中定义此vhost
RewriteMap lc int:tolower

然后在你的.htaccess中有一个额外的规则来小写所有大写的URI:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301,NE]

# redirect to .php-less link if requested directly
RewriteCond %{THE_REQUEST} ^[A-Z]+\s.+\.php\sHTTP [NC]
RewriteRule ^(.+)\.php$ /$1 [R=301,L,NC,NE]

# convert each REQUEST_URI to lowercase
RewriteRule ^(.*?[A-Z]+.*)$ /${lc:$1} [R=301,L,NE]

# internally add .php 
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

答案 1 :(得分:-1)

在规则中使用[NC]标志

  

使用[NC]标志会使RewriteRule在a中匹配   不区分大小写的方式。也就是说,它不关心是否是字母   在匹配的URI中显示为大写或小写。

https://httpd.apache.org/docs/current/rewrite/flags.html

答案 2 :(得分:-1)

您需要处理两个方面:首先是不区分大小写的匹配,然后是大小写转换为小写。

Apache的重写模块为第一个方面提供了NC标志,为第二个方面提供了更为复杂的方法:

RewriteEngine On

# remove trailing slash (/) if no such folder exists
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /${lc:$1}  [NC,L,R=301]

# internally rewrite to a php script if it exists and convert to lower case
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ /${lc:$1}.php [NC,L]

# redirect to .php-less link if requested directly
RewriteRule ^(.+)\.php$ ${lc:$1}  [NC,L,R=301]

我的印象是,你原来的一套重写规则并没有真正实现你的目标,即使它在语法上也无效。这就是为什么我改变了一些方面。