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

65

Я пытаюсь, чтобы правила 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 и т.д. (хотя я не думаю, что это важно
  • 0
    В apache 2.2 вам может понадобиться RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f прочитать это stackoverflow.com/a/12575089/516748
Теги:
mod-rewrite

11 ответов

123

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

RewriteRule ^vip - [L,NC] 

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

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

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

  • 0
    Кстати, у меня была такая же проблема несколько недель назад, и это работало для меня на Apache / 2.2.8 (UNIX).
  • 0
    почему бы не использовать RewriteRule ^vip/? - [L,NC] чтобы позаботиться о проблеме косой черты?
Показать ещё 4 комментария
13
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

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

  • 0
    Это не работает, если в конце есть косая черта
  • 0
    Он прав, этих правил должно быть достаточно. Проблема в том, что каталог защищен паролем. См. Другие ответы ниже (включая мой), которые уточняют это.
9

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

  • 1
    Что касается моего upvote для этого решения. У меня был пароль .htaccess, защищающий подкаталог, который передавался в index.php, файл err.txt, позволил мне обработать каталог.
  • 1
    У меня была другая папка в каталоге WordPress, которая содержала отдельное приложение php. Это приложение выдавало ошибку, но вместо того, чтобы получить ошибку, оно возвращалось через WordPress и давало мне 404. Это решение решает эту проблему, и я смог увидеть ошибку 500, которая была выдана приложением php. Спасибо вам большое!
Показать ещё 1 комментарий
8

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

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

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

RewriteEngine off

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

  • 0
    Не помогло бы, так как .htaccess в родительском каталоге, в котором есть правила перезаписи, оценивался задолго до того, как Apache изучил / vip.
  • 2
    Я просто использовал этот метод, и он работал нормально. И у меня есть .htaccess в родительском каталоге, включив переписать двигатель. Так что я думаю, что Apache ищет в дочернем каталоге независимо.
4

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

RewriteRule ^vip/.$ - [PT]

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

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

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

  • 0
    Это помогло мне в случае, когда уже существовало общее правило (заблокировать все скрытые каталоги, которые начинаются с.), Но мне нужно было сделать одно исключение (разрешить .well-known для letsencrypt работать на cron).
3
RewriteCond %{REQUEST_URI} !^pilot/ 

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

3

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

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
3

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

В моем случае ответ 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.

  • 0
    Вы можете оставить комментарий вместо того, чтобы поставить ответ тоже.
-2

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню