问题:
http://<server>/home/APPLE.html
http://<server>/hoME/APPLE.html
http://<server>/HOME/aPPLE.html
http://<server>/hoME/aPPLE.html
以上所有都应该选择这个
http://<server>/home/apple.html
我实施了 2 个解决方案,都运行良好。不确定哪一个更好(性能更好)。请提出建议。指令 - CheckCaseOnly从未工作过
选项1:
a)启用:mod_speling 在 /etc/sysconfig/apache2 - APACHE_MODULES="rewrite拼写铠甲......”
b) 添加指令 - CheckSpelling on(在 .htaccess 中或在 httpd.conf 中添加) 在 httpd.conf 中
<Directory srv/www/htdcos/home>
Order allow,deny
CheckSpelling on
Allow from all
</Directory>
或者
在 .htaccess 中的 /srv/www/htdcos/home (您的内容文件夹)
CheckSpelling on
选项 2:
a)启用:mod_rewrite
b) 写入规则 vhost(不能在目录中写入 RewriteMap。检查 apache 文档)
<VirtualHost _default_:80>
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteMap lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]
</IfModule>
</VirtualHost>
<VirtualHost _default_:80>
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteMap lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]
</IfModule>
</VirtualHost>
这会将整个请求 uri 更改为小写。我希望这适用于特定文件夹,但 RewriteMap 在 .htaccess 中不起作用。我是正则表达式和 Rewrite 的新手。我需要一个仅检查 /css// 的 RewriteCond。有人能帮忙吗
答案1
mod_rewrite 解决方案不会使 Apache 不区分大小写。它只是确保如果请求是大写或大小写混合,它将匹配小写的资源。它无法解决您要提供的资源是大写或大小写混合且请求无法正确匹配的情况。使用 mod_rewrite 无法使 Apache 不区分大小写。(参考)
如果您确定您提供的所有资源都是小写,那么这可能满足您的需求,但它不区分大小写。另一个潜在问题是重写规则实际上并没有验证资源是否存在,因此您最终可能会返回一个 301 永久重定向到一个不存在的资源。根据您的大小写错误数量,对您的影响可能很小。服务器将收到第二个错误请求并返回 404,这意味着负载增加。无论对您有什么影响,返回一个不存在的 URL 的永久重定向都是不好的形式。
mod_speling 解决方案实际上不区分大小写,不会返回不存在的资源的重定向。由于 mod_speling 需要执行目录扫描来验证 url 是否与目标相符,因此会产生一些开销。如果您只关心大小写,则可以使用指令CheckCaseOnly on
来限制模块执行的检查,从而减少开销。