Як ігнорувати каталог у mod_rewrite?


74

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

На Apache 2.2 ви , можливо , буде потрібно RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-fпрочитати цю stackoverflow.com/a/12575089/516748
KCD

Відповіді:


131

Спробуйте поставити це перед будь-якими іншими правилами.

RewriteRule ^vip - [L,NC] 

Він буде відповідати будь-якому початку URI vip.

  • В -означає нічого не робити.
  • LЧи означає , що це має бути останнім правилом; ігнорувати все наступне.
  • Кошти NCвідсутні (тому "VIP" також відповідає).

Зверніть увагу, що воно відповідає будь-якому початку vip . Вираз ^vip$відповідав би, vipале ні vip/або vip/index.html. $Може бути ваша загибель. Якщо ви дійсно хочете зробити це правильно, ви можете піти з цим, ^vip(/|$)щоб не збігатисяvip-page.html


До речі, у мене була та сама проблема кілька тижнів тому, і це спрацювало для мене на Apache / 2.2.8 (UNIX).
Патрік МакЕлхейні,

чому б не RewriteRule ^vip/? - [L,NC]потурбуватися про проблему косої риси?
Брук.

2
@Brandon Це, по суті, еквівалентно ^vip. Він відповідав би "vip", після чого слід коса риса (можливо) та деякі інші символи (можливо). Ми хочемо точно відповідати "vip" ( ^vip$) або будь-якому рядку, який починається з "vip /" ( ^vip/).
Patrick McElhaney

Причина, яка не працює, така ж, як і те, чому існуючі RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-dне працюють. У відповідному каталозі є спеціальний файл .htaccess, який спричиняє помилку - те ж саме буде і з захищеним паролем каталогом.
brentonstrine

Це спрацювало. Я все ж підкоригував його для власного використання. Щоб зробити так, щоб будь-яка папка "/ vip /" працювала, використовуйте "RewriteRule \ / vip \ / - [L, NC]"
Kyle Bridenstine

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

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


Він правий, цих правил має бути достатньо. Проблема в тому, що каталог захищений паролем. Дивіться інші відповіді нижче (включаючи мою), в яких це детально розроблено.
brentonstrine

10

Код, який ви додаєте, і всі відповіді, що містять правила / умови перезапису, марні! Код 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
Щодо мого голосу за це рішення. У мене був пароль .htaccess, який захищав підкаталог, який проходив до index.php, файлу err.txt, що дозволило мені обробити каталог.
Фотіс Параскевопулос

1
У мене була інша папка в каталозі wordpress, яка містила окрему програму php. Цей додаток видавав помилку, але замість того, щоб отримати помилку, він повертався через wordpress і видавав мені 404. Це рішення вирішує цю проблему, і я зміг побачити помилку 500, яку спричинила програма php. Дуже дякую!
Пол Зепернік

Це ідеальне рішення для тих, хто має проблеми з підпапками, захищеними htpasswd. Дякую!
Євген Сью

9

Таким чином, остаточним рішенням є:

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 у цій папці, якщо це так, це не допоможе, оскільки ви не можете його вимкнути).


Не допомогло б, оскільки .htaccess у батьківському каталозі, який має правила перезапису, оцінювався б задовго до того, як Apache заглянув у / vip.
Marc B

2
Я просто використовував цей метод, і він працював нормально. І у мене є .htaccess у батьківському каталозі, що вмикає rewriteengine. Тож, напевно, Apache незалежно виглядає у дочірньому каталозі.
Адам Калп,

7

Спробуйте замінити цю частину коду:

RewriteRule ^ vip /.$ - [PT]

... із наступним:

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

Це має виправити ситуацію.


Це допомогло мені у випадку, коли вже було загальне правило (заблокувати всі приховані каталоги, що починаються з.), Але мені потрібно було зробити одне виняток (дозволити .well-known for letsencrypt працювати на cron).
squarecandy


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,


3

Це працює ...

RewriteRule ^vip - [L,NC]

Але переконайтеся, що це перше правило після

RewriteEngine увімкнено

тобто

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

У моєму випадку відповідь брентонстрином (і я бачу 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.


Ви можете залишити коментар, замість того щоб відповісти теж.
brentonstrine

-1

Я не впевнений, чи розумію я вашу мету, але наступне може зробити те, що вам потрібно?

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.