我访问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]
如果应该更改此规则,则由您决定。
答案 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中显示为大写或小写。
答案 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]
我的印象是,你原来的一套重写规则并没有真正实现你的目标,即使它在语法上也无效。这就是为什么我改变了一些方面。