向现有.htaccess添加选项

时间:2013-10-05 13:28:49

标签: .htaccess

我有这个.htaccess代码,我已经从不同的来源放在一起,我无法添加一些额外的选项。

<Limit GET POST PUT>
 order deny,allow
 deny from all
 allow from XXX.XXX.XXX.XXX
</Limit>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d

# allow things that are certainly necessary
RewriteCond %{REQUEST_URI} "/css/" [OR]
RewriteCond %{REQUEST_URI} "/js/" [OR]
RewriteCond %{REQUEST_URI} "/images/"

RewriteRule .* - [L]
RewriteRule ^([a-zA-Z0-9-/_]+)/([a-zA-Z0-9-/_%]+)/([a-zA-Z0-9-/_]+)/([a-zA-Z0-9-/_]+)$  index.php?primary=$1&secondary=$2&tertiary=$3&quaternary=$4 [QSA]
RewriteRule ^([a-zA-Z0-9-/_]+)/([a-zA-Z0-9-/_%]+)/([a-zA-Z0-9-/_]+)$  index.php?primary=$1&secondary=$2&tertiary=$3 [QSA]
RewriteRule ^([a-zA-Z0-9-/_]+)/([a-zA-Z0-9-/_%]+)$  index.php?primary=$1&secondary=$2 [QSA]
RewriteRule ^([a-zA-Z0-9-/_]+)$  index.php?primary=$1 

首先,我想在URL中添加强制使用www.。当我尝试添加此项时,生成的URL将成为当前RewriteRule的输出,其中包含GET个变量。我相信这是因为规则适用于循环?

我想做的另一件事是捕捉任何不符合当前规则标准的内容,并将其发送到index.php?primary=error之类的内容。它现在的工作方式是几乎完全适合我的使用,因为如果有一个格式错误的URL或非法字符,该网站甚至不会尝试显示该页面。该网站将安全地创建所有网址,因此任何错误的网址都是在地址栏中进行试验的结果,但是有一个错误页面而不是找不到页面会很好。

提前致谢..对于RewriteRule的混乱使用感到抱歉!

1 个答案:

答案 0 :(得分:2)

你的正则表达式是不正确的,因为连字符只有当它在字符类中作为第一个或最后一个符号出现时才能转义,否则需要转义。

所以而不是:[a-zA-Z0-9-/_%]
使用:[\w%/-]

您的完整规则:

RewriteEngine On
RewriteBase /

# add www in the URL    
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,NE,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
# allow things that are certainly necessary
RewriteCond %{REQUEST_URI} ^/(css|js|images)/ [NC]
RewriteRule ^ - [L]

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ index.php?primary=$1&secondary=$2&tertiary=$3&quaternary=$4 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?primary=$1&secondary=$2&tertiary=$3 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?primary=$1&secondary=$2 [QSA,L]
RewriteRule ^([^/]+)/?$ index.php?primary=$1 [QSA,L]