Как игнорировать каталог в mod_rewrite?

Я пытаюсь, чтобы правила 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 и т.д. (хотя я не думаю, что это важно

Ответ 1

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

RewriteRule ^vip - [L,NC] 

Он будет соответствовать началу URI vip.

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

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

Ответ 2

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

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

Ответ 3

Код, который вы добавляете, и все ответы, которые предоставляют правила/условия перезаписи, бесполезны! Код 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).

Ответ 4

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

RewriteEngine off

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

Ответ 5

Таким образом, окончательное решение:

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, которые, как я ожидаю, многие другие будут иметь на мой сайт.

Ответ 6

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

RewriteRule ^vip/.$ - [PT]

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

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

Это должно исправить ситуацию.

Ответ 7

У меня была такая же проблема с использованием 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,

Ответ 8

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

RewriteRule ^vip - [L,NC]

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

RewriteEngine on

то есть.

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

Ответ 9

RewriteCond %{REQUEST_URI} !^pilot/ 

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

Ответ 10

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

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

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

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

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

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

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

Ответ 11

Я не уверен, понимаю ли я вашу цель, но следующее может сделать то, что вам нужно?

RewriteRule ^/vip/(.*)$   /$1?%{QUERY_STRING} [L]

Это приведет к тому, что URL-адрес, например http://www.example.com/vip/fred.html, будет перезаписан без/vip.