2

我有这个 .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 

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

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

在此先感谢.. 很抱歉混淆使用RewriteRule!

4

1 回答 1

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]
于 2013-10-05T13:33:50.937 回答