Как мне игнорировать каталог в mod_rewrite? - PullRequest
73 голосов
/ 02 октября 2008

Я пытаюсь, чтобы правила modrewrite пропустили каталог vip. Я попробовал несколько вещей, как вы можете видеть ниже, но безрезультатно.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#RewriteRule ^vip$ - [PT]
RewriteRule ^vip/.$ - [PT]
#RewriteCond %{REQUEST_URI} !/vip 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Как заставить modrewrite полностью игнорировать каталог /vip/, чтобы все запросы передавались непосредственно в папку?

Обновление:

Для ясности:

  • Он размещен на Dreamhost
  • Папки находятся в каталоге WordPress
  • папка / vip / содержит webdav .htaccess и т. Д. (Хотя я не думаю, что это важно

Ответы [ 11 ]

127 голосов
/ 02 октября 2008

Попробуйте поставить это перед любыми другими правилами.

RewriteRule ^vip - [L,NC] 

Соответствует любому URI, начинающемуся vip.

  • - означает ничего не делать.
  • L означает, что это должно быть последним правилом; игнорируйте все следующее.
  • NC означает отсутствие регистра (так что "VIP" также сопоставляется).

Обратите внимание, что оно совпадает с чем угодно начало vip. Выражение ^vip$ будет соответствовать vip, но не vip/ или vip/index.html. $ может быть вашим падением. Если вы действительно хотите сделать это правильно, вы можете использовать ^vip(/|$), чтобы не соответствовать vip-page.html

14 голосов
/ 08 ноября 2008
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Это говорит о том, что это существующий файл или каталог, не трогайте его. Вы должны иметь доступ к site.com/vip, и правила переписывания не применяются.

10 голосов
/ 10 августа 2013

Код, который вы добавляете, и все ответы, которые предоставляют правила / условия перезаписи, бесполезны! Код WordPress по умолчанию уже делает все, что вам нужно:

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

Эти строки говорят: «если это НЕ существующий файл (-f) или каталог (-d), передайте его в WordPress. Добавление дополнительных правил, независимо от того, насколько они конкретны или хороши, является избыточным - вы должны быть уже охвачены правилами WordPress!

Так почему они не работают ???

.htaccess в каталоге vip выдает ошибку. То же самое происходит, если вы защищаете каталог паролем.

Вот решение:

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

Вставьте эти строки перед кодом WordPress, а затем создайте /err.txt. Таким образом, когда он сталкивается с вашим WebDAV (или каталогом, защищенным паролем) и не работает, он переходит к этому файлу и попадает в существующее условие WordPress по умолчанию (RewriteCond %{REQUEST_FILENAME} !-f).

9 голосов
/ 08 августа 2010

В итоге, окончательное решение:

ErrorDocument 401 /misc/myerror.html
ErrorDocument 403 /misc/myerror.html

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Я написал больше о причине этой проблемы в моей конкретной ситуации, связанной с Wordpress и WebDAV на Dreamhost, что, как я ожидаю, будет у многих других на моем сайте .

8 голосов
/ 02 октября 2008

Вы упомянули, что у вас уже есть файл .htaccess в каталоге, который вы хотите игнорировать - вы можете использовать

RewriteEngine off

В этом .htaccess, чтобы прекратить использование mod_rewrite (не уверен, если вы используете mod_rewrite в этой папке, если это так, это не поможет, так как вы не можете отключить его).

6 голосов
/ 11 июня 2013

Попробуйте заменить эту часть вашего кода:

RewriteRule ^vip/.$ - [PT]

... со следующим:

RewriteCond %{REQUEST_URI} !(vip) [NC]

Это должно все исправить.

4 голосов
/ 30 ноября 2012
RewriteCond %{REQUEST_URI} !^pilot/ 

это способ сделать это.

3 голосов
/ 28 февраля 2011

Это работает ...

RewriteRule ^vip - [L,NC]

Но убедитесь, что это первое правило после

ПереписатьEngine на

т.е.

ErrorDocument 404 /page-not-found.html

RewriteEngine on

RewriteRule ^vip - [L,NC]

AddType application/x-httpd-php .html .htm

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 

etc
3 голосов
/ 19 апреля 2010

У меня была такая же проблема с использованием WordPress и я обнаружил, что проблема связана с отсутствием надлежащего обработчика для ошибок 401 и 403

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Предполагается, что эти условия уже не перезаписывают URL существующих папок, но они не выполняют свою работу для папок, защищенных паролем. В моем случае добавление следующих двух строк в мой корень .htaccess решило проблему:

ErrorDocument 401 /misc/myerror.html
ErrorDocument 403 /misc/myerror.html

Конечно, вам нужно создать /misc/myerror.html,

2 голосов
/ 22 октября 2014

В моем случае, ответ brentonstrine (и я вижу, matdumsa также имела ту же идею) был правильным ... Я хотел бы проголосовать за их ответы, но, будучи новичком здесь, у меня нет «репутации», поэтому я должен написать полный ответ, чтобы подчеркнуть то, что я считаю настоящим ключом здесь.

Некоторые из этих ответов успешно остановят использование WordPress index.php ... но во многих случаях причина этого заключается в том, что существует реальный каталог с реальными страницами, которые вы хотите отобразить напрямую, и

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

строк уже позаботились об этом, поэтому большинство таких решений отвлекают внимание в случае, подобном моему.

Ключом было понимание brentonstrine , что ошибка была вторичным эффектом, вызванным защитой паролем внутри каталога, который я пытался отобразить напрямую. Поместив в

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

строк и создание страниц с ошибками (на самом деле я создал err401.html и err403.html и сделал более информативные сообщения об ошибках). Я остановил генерирование ответа 404, когда не удалось найти страницу для отображения для 401 Требуется аутентификация, а затем папка работала должным образом ... показывая диалоговое окно входа в систему Apache, затем содержимое папки или, при ошибке, страница 401 с ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...