2013-10-05 5 views
2

У меня есть этот .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 

Во-первых, я хотел бы добавить принудительное использование www. в URL. Когда я попытался добавить это, полученный URL-адрес станет выходом текущего RewriteRule s, содержащего переменные GET. Я считаю, что это потому, что правила работают над циклом?

Еще одна вещь, которую я хотел бы сделать, - это поймать все, что не соответствует критериям действующих правил, и отправить что-то вроде index.php?primary=error. Теперь он работает почти, который идеально подходит для моего использования, потому что, если есть неправильный URL или незаконный символ, сайт не собирается даже пытаться отобразить страницу. Сайт будет создавать все URL-адреса безопасно, поэтому любые плохие URL-адреса будут результатом экспериментов в адресной строке, но было бы неплохо иметь страницу с ошибкой, а не страницу не найдена.

Заранее благодарим .. И извините за использование путаницы RewriteRule!

ответ

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] 
+0

Это, конечно, много Tider, спасибо. Запуск одного из последних 4 RewriteRules заставляет меня получить страницу, которая не найдена, хотя .. Как будто использование простого слова для последнего правила не квалифицируется как действительное. –

+0

Какой URL-адрес вы указали в браузере? – anubhava

+0

Он разрешает только определенные IP-адреса, поэтому я напишу их как: http://www.domain.com/hub (не работает), http://www.domain.com (работает) –

Смежные вопросы