it-roy-ru.com

RewriteCond в .htaccess с отрицательным условием регулярного выражения не работает?

Я пытаюсь предотвратить, в этом случае WordPress, переписывание определенных URL. В этом случае я пытаюсь предотвратить обработку запроса в каталоге загрузки, а вместо этого оставить его на странице 404 сервера. Итак, я предполагаю, что это так же просто, как добавить правило:

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/

Это правило должно принимать значение false и приводить к сбою цепочки правил для этих запросов, что останавливает перезапись. Но нет ... Возможно, мне нужно сопоставить обложку с полной строкой в ​​моем выражении?

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/.*$

Нет, это тоже не так. Поэтому, почесав голову, я проверил здравомыслие. Возможно, что-то не так с реальной моделью. Поэтому я делаю простой контрольный пример.

RewriteCond %{REQUEST_URI} ^/xyz/$

В этом случае перезапись происходит тогда и только тогда, когда запрошенный URL-адрес является/xyz/и отображает страницу сервера 404 для любой другой страницы. Это именно то, что я ожидал. Так что я просто вставлю! отрицать эту модель.

RewriteCond %{REQUEST_URI} !^/xyz/$

Теперь я ожидаю увидеть полную противоположность вышеуказанному условию. Перезапись должна происходить не для/xyz /, а для любого другого возможного URL. Вместо этого перезапись происходит для каждого URL, как/xyz /, так и других.

Итак, либо использование отрицательных регулярных выражений в RewriteConds не работает в Apache, либо есть нечто фундаментальное, чего я не понимаю в этом. Который из них?

Сервер Apache2.

Файл целиком:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-content/uploads/
RewriteRule . /index.php [L]
</IfModule>

Файл WordPress по умолчанию плюс мое правило.

17
nitro2k01

Итак, после большого раздражения я разобрался в проблеме. Как оказалось, правило в моем первоначальном вопросе действительно сделало именно то, что и предполагалось. Так же, как и ряд других способов сделать то же самое, таких как

RewriteRule ^wp-content/uploads/.*$ - [L]

(Отметьте правило как последнее, если шаблон соответствует) или

RewriteRule ^wp-content/uploads/.*$ - [S=1]

(Пропустите следующее правило, если шаблон соответствует), а также отрицательное правило в вопросе, как уже упоминалось. Все эти правила работали просто отлично и возвращали управление Apache без переписывания.

Проблема возникла после обработки этих правил. Вместо этого проблема заключалась в том, что я удалил шаблоны по умолчанию 404.shtml, 403.shtml и т.д., Предоставленные моим хостом. Если у вас нет .htaccess переписывает, это работает просто отлично; сервер соберет свою собственную страницу 404 по умолчанию, и все работает. (По крайней мере, я так думал, но на самом деле это была двойная ошибка: «Кроме того, при попытке использовать ErrorDocument для обработки запроса была обнаружена ошибка 404 Not Found».)

Когда у вас есть .htaccess, с другой стороны, он выполняется во второй раз для страницы 404. Если страница есть, она будет использоваться, но теперь вместо этого запрос на 404.shtml был перехвачен правилом catch-all и переписан в index.php. По этой причине все другие предложения, которые я получил здесь или где-либо еще, потерпели неудачу, потому что в конце страница 404 была переписана в index.php.

Таким образом, решение было просто восстановить шаблоны ошибок. Оглядываясь назад, было довольно глупо удалять их, но у меня есть этот менталитет «с нуля». Не хочу ничего, казалось бы, ненужного валяться. По крайней мере, теперь я понимаю, что происходит, чего я и хотел.

Наконец комментарий Сесилу: я никогда не хотел запрещать доступ к чему-либо, просто остановил переписывание. Не то чтобы сейчас это имело большое значение, но я просто хотел уточнить это.

7
nitro2k01
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/ [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . /index.php [L]
</IfModule>
9
Cecil

Если /wp-content/uploads/ действительно является префиксом запрошенного пути URI, ваше правило должно работать так, как ожидалось.

Но поскольку это, очевидно, не работает, попробуйте не сопоставлять префикс пути полного пути URI, а только оставшийся путь без контекстного префикса пути для каталога, в случае файла .htaccess в корневом каталоге документа путь URI без ведущего /:

RewriteCond $0 !^wp-content/uploads/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ /index.php [L]

Если это тоже не сработает, это, безусловно, поможет получить представление о процессе перезаписи mod_rewrite с помощью его функции ведения журнала . Поэтому установите RewriteLogLevel на уровень не менее 4, сделайте запрос и посмотрите записи в файле журнала, указанные с помощью RewriteLog . Там вы можете увидеть, как mod_rewrite обрабатывает ваш запрос, а с RewriteLogLevel, большим или равным 4, вы также увидите значения переменных, таких как %{REQUEST_URI}.

2
Gumbo

Я нашел много примеров, подобных этому, когда подход «WordPress First». Например, добавив:

ErrorDocument 404 /error-docs/404.html

в файл .htaccess позаботится о сообщении («Кроме того, ошибка 404 Not Found ...»).

0
cbos