Я пытаюсь, чтобы правила 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/
, чтобы все запросы передавались непосредственно в папку?
Как точки ясности:
Попробуйте поставить это перед любыми другими правилами.
RewriteRule ^vip - [L,NC]
Он будет соответствовать началу URI vip
.
-
означает ничего не делать.L
означает, что это должно быть последнее правило; игнорируйте все, что следует.NC
означает "нет" (так что "VIP" также соответствует).Обратите внимание, что это соответствует началу vip
. Выражение ^vip$
будет соответствовать vip
, но не vip/
или vip/index.html
. Возможно, это был $
. Если вы действительно хотите сделать это правильно, вы можете пойти с ^vip(/|$)
, чтобы вы не соответствовали vip-page.html
RewriteRule ^vip/? - [L,NC]
чтобы позаботиться о проблеме косой черты?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Это говорит о том, что он не затрагивает существующий файл или каталог. Вы должны иметь доступ к site.com/vip, и не должно быть правила перезаписи.
Код, который вы добавляете, и все ответы, которые предоставляют правила/условия перезаписи, бесполезны! Код 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
).
Таким образом, окончательное решение:
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, которые, как я ожидаю, многие другие будут иметь на мой сайт.
Вы упомянули, что у вас уже есть файл .htaccess в каталоге, который вы хотите игнорировать, - вы можете использовать
RewriteEngine off
В этом .htaccess прекратить использование mod_rewrite (не уверен, что вы используете mod_rewrite в этой папке, если вы тогда это не поможет, так как вы не можете отключить его).
Попробуйте заменить эту часть своего кода:
RewriteRule ^vip/.$ - [PT]
... со следующим:
RewriteCond %{REQUEST_URI} !(vip) [NC]
Это должно исправить ситуацию.
RewriteCond %{REQUEST_URI} !^pilot/
- способ сделать это.
Это работает...
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
У меня была такая же проблема с использованием 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,
В моем случае ответ 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.
Я не уверен, понимаю ли я вашу цель, но следующее может сделать то, что вам нужно?
RewriteRule ^/vip/(.*)$ /$1?%{QUERY_STRING} [L]
Это приведет к тому, что URL-адрес, например http://www.example.com/vip/fred.html, будет перезаписан без/vip.
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
прочитать это stackoverflow.com/a/12575089/516748