.htaccess重写匹配除了之外的东西

时间:2011-07-30 19:39:24

标签: .htaccess

我正在尝试让我的.htaccess文件正常工作。好吧它已经有效,但现在有些烦人。

我已经修改了我的.htaccess以支持多语言网站:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} !^/public/[a-z]{2}/ [NC]
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

# match those that DO have a language code
RewriteRule ^([a-z]{2})/(.*)$ index.php?lang=$1&url=$2 [PT,L]

这就像一个魅力。当一个双字母语言代码添加到URL的开头时,“lang”被添加到我的index.php中。然而,这是一个问题,因为我的javascript文件夹被称为“js”,这意味着这将被视为语言代码。我实际上认为两个第一个RewriteCond会阻止这种情况发生,但显然它不是。

我必须承认.htaccess不是我最擅长的,所以我可能错过了某种简单的解决方案。

1 个答案:

答案 0 :(得分:4)

选项#1:使用此规则(而不是最后一行):

RewriteRule ^(?!js)([a-z]{2})/(.*)$ index.php?lang=$1&url=$2 [PT,L]

这对/js/hello无效,但如果请求/en/hello(例如),则会重写。

选项#2:添加类似于之前规则的条件(我假设/public/js/是JavaScript文件的实际文件夹 - 如果不是,请根据需要调整名称) :

RewriteCond %{REQUEST_URI} !^/public/js/
RewriteRule ^([a-z]{2})/(.*)$ index.php?lang=$1&url=$2 [PT,L]

我建议#1 - 它可能更难理解..但它都是单行且速度更快(单个正则表达式与#2中的两个)。