2011-12-14 4 views
1

Я пытаюсь лучше понять mod_rewrite, и я столкнулся с некоторыми отличиями, которые Я думаю, сделать то же самое? В этом случае нет существующих файлов или каталогов и переписывания на страницу index.php.RewriteRule тонкие отличия - один в одном?

RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .+ - [L] 

Нужно ли мне [ИЛИ] или я могу его оставить?

В чем отличия или преимущества следующих правил? Я в настоящее время использую первый, но я наткнулся на последние четыре в таких местах, как WordPress:

#currently using 
RewriteRule ^(.+)$ index\.php?$1 [L] 

RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 

ответ

0

мне нужна [OR] или я могу оставить его?

В этом случае вам нужно [OR] потому что RewriteCond являются по своей сути операции AND, и это не тот случай, что запрос является как файл и каталог (насколько mod_rewrite обеспокоен).

RewriteRule ^(.+)$ index\.php?$1 [L] 

Это переписывает все запросы, которые не являются для корневого документа (например, http://domain.com/) в виде строки запроса для index.php, таким образом, запрос http://domain.com/some/path/file.html получает внутренне переписан index.php?some/path/file.html

RewriteRule ^index\.php$ - [L] 

Это правило, предотвращающее цикл перезаписи. Механизм перезаписи продолжит цикл всех правил до тех пор, пока URI не станет прежним до повторной перезаписи и после (без строки запроса). Если URI начинается с index.php, просто остановите текущую повторную итерацию (что делает -). Механизм перезаписи видит, что URI перед отправкой по правилам был index.php и после того, как правила были index.php, при этом перезаписываемый движок останавливается и все переписывание выполняется. Это препятствует тому, чтобы mod_rewrite переписывал вещи на index.php?index.php, которые первое правило будет делать на втором проходе через механизм перезаписи, если это не для этого правила.

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 

Это уловка. Если первое правило никогда не применяется, и запрос не для существующего файла или каталога, отправьте запрос index.php. Хотя в этом случае похоже, что это правило никогда не будет применяться.


EDIT:

есть способ игнорировать определенное правило, если условие истинно? Например, www.domain.com/some/path> index.php? Some/path, но если URI - это www.domain.com/this/path> no rewrite?

Вы должны были бы добавить 2 условия, тот, который проверяет, чтобы убедиться, что запрашиваемый хост не «www.domain.ком»и один, чтобы проверить, что URI не„/ это/путь“:

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC,OR] 
RewriteCond %{REQUEST_URI} !^/some/path 

[NC] указывает на то, что совпадает с условием должны игнорировать регистр, поэтому, когда кто-то входит в URL http://WWW.domain.com/ в адресной строке , он будет соответствовать (или в этом случае не соответствует). Второе условие соответствует, когда URI начинается с «/ some/path», что означает, что запросы для http://domain.com/some/path/file.html будут совпадать и НЕ будут перезаписаны. Если вы хотите точно соответствовать «/ some/path», то регулярное выражение должно быть !^/some/path$.

Почему бы не использовать [OR] в последнем блоке между -f и! -d?

Это логическое отрицание -f или -d: «если файл существует, не переписать, или, если каталог существует, не переписать» превращается в «если файл Безразлично 't существуют, И если в каталоге нет, то перепишите «

+0

Привет, Jon, спасибо за объяснение. Быстрое наблюдение ... есть ли способ игнорировать определенное правило, если условие истинно? Например, www.domain.com/some/path> index.php? Some/path, но если URI - это www.domain.com/this/path> no rewrite? Нужно ли также \ .php? Почему бы не использовать [OR] в последнем блоке между -f и! -d? – hybrid9

+0

Не знаю, что вы подразумеваете под «Нужно ли также и \ .php?», Но см. Мое редактирование для ответа на другие 2 вопроса. –

+0

Ах, теперь я вижу. Я собираюсь запустить некоторые тестовые примеры для практики. То, что я подразумевал под «\ .php», - это то, что включает «\», а не только index.php. Мне не хватало! перед. Пространство имеет значение, можно сделать! - f? – hybrid9

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