.htaccess & Wordpress: Исключить папку из RewriteRule

У меня есть этот файл .htaccess в Wordpress. Он расположен в/public_html/(веб-корень). Мне нужно исключить папку (csNewsAd) из механизма перезаписи. Я пробовал это, основываясь на другом вопросе, подобном здесь, в SO, но не работал вообще.

AddHandler x-httpd-php5 .php
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/csNewsAd($|/) - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Любые предложения?

Дополнительные данные

Там есть другой .htaccess внутри /csNewsAd для защиты паролем:


AuthName "Clasificados"
AuthType "basic"
AuthUserFile /home/ig000192/public_html/csNewsAd/.passwd
Require valid-user

Ответы

Ответ 1

RewriteCond %{REQUEST_URI} !^/(csNewsAd|csNewsAd/.*)$ 

вместо

RewriteRule ^/csNewsAd($|/) - [L] 

Ответ 2

Поместите строку ниже в файл .htaccess в корневом каталоге.

ErrorDocument 401 default

Была такая же проблема, и это сработало для меня. Проблема не в том, что перенаправления не работают. Проблема в том, что ошибка 401 (Требуется авторизация) определена как nog, поэтому "popup" не отображается.

Ответ 3

Имел ту же проблему и нашел ответ на мою проблему здесь: http://kb.siteground.com/article/How_to_exclude_a_folder_from_Wordpress_permalinks.html

- С сайта

Чтобы исключить вложенные папки из правил перезаписи WordPress, вам необходимо отредактировать файл .htaccess и изменить выделенную строку ниже:

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

Ответ 4

.htaccess влияет на все каталоги под ним, поэтому, если вы поместите .htaccess в csNewsAd с необходимыми директивами перезаписи, он будет иметь приоритет над корневым файлом.

Ответ 5

Если вы используете mod_rewrite в файле .htaccess, вам просто нужно указать путь URL без префикса локального пути в ваших шаблонах. В вашем случае без ведущего / (как вы в корневом документе /):

RewriteRule ^csNewsAd($|/) - [L]

Ответ 6

Сначала я начал делать это с помощью Rails. В верхней части рельсов .htaccess находятся следующие две строки.

# RewriteCond %{REQUEST_URI} ^/notrails.*
# RewriteRule .* – [L]

Когда я, наконец, последовал их примеру, он работал.

Я хотел исключить изображения, javascripts, stylesheets, css, images-global, js-global (и т.д.), поэтому я изменил приведенное выше.

RewriteCond %{REQUEST_URI} ^(images|javascripts|stylesheets|css|images-globa|js-global|js).*
RewriteRule .* – [L]

И он работал так, как мне было нужно.

Мы не будем говорить о том, что у меня так много разных javascript, таблиц стилей и изображений...

Но это делает мой файл с ошибкой менее болезненным. Если кто-то добавляет файл изображения, который не существует, моя отправка не должна обрабатывать его.

Ответ 7

У меня есть хостинг GoDaddy, и эта проблема меня убила. У меня были одни и те же проблемы снова и снова с конфликтующими параметрами .htaccess в public_html с моим подпапкой, защищенной паролем.

Я закончил покупку другой учетной записи, потому что я попробовал около миллиона различных модификаций в моем файле .htaccess, и я не работал над этой проблемой. Теперь я делюсь своей настройкой и решением, просто для полноты и ясности. (Как раз так вы знаете, учетная запись того стоила, так что не biggie.)

Если это похоже на комбинацию других ответов, это потому, что это так. Для этого потребовалось ВСЕ.

Структура каталогов:

-otherfiles
---public_html
---.htaccess
-----subfolder
---.htaccess

Вложенная папка .htaccess имеет пароль для функции защиты, что похоже на это:

AuthType Basic
AuthName "Attendance"
AuthUserFile "/home/user/.htpasswds/public_html/attendance/passwd"
require valid-user

Первоначально public_html.htaccess имел это, и он не работал (тем, что он проглотил ВСЕ и перенаправил его, чтобы FatFreeFramework или CodeIgniter обрабатывали его):

RewriteEngine On
RewriteCond $1 !^(index.php|resources|subfolder|robots.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

Чтобы исправить эту проблему, я добавил две строки в файл public_html.htaccess. И поэтому вы не догадываетесь о том, где я снова покажу весь файл:

RewriteEngine On
RewriteCond $1 !^(index.php|resources|robots.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_URI} !^/(subfolder|subfolder/.*)$
ErrorDocument 401 default
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

Итак, это моя история. Он работает сейчас. Спасибо Джори и GmonC!!! Я поддержал вас, ребята.

Ответ 8

Вот мое решение в отношении сайта GoDaddy WordPress. У моей установки был файл web.config, поэтому я добавил правило перезаписи. Мне нужен путь /ApiData, где я мог бы запускать приложение MVC.net(виртуальный каталог) для вызовов AJAX.

<system.webServer>
    <!-- ... -->
    <rewrite>
        <rules>
            <rule name="apidata" stopProcessing="true">
                <match url="apidata"/>
            </rule>
            <rule name="wordpress" patternSyntax="Wildcard">
                <match url="*"/>
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
                </conditions>
                <action type="Rewrite" url="index.php"/>
            </rule>

        </rules>
    </rewrite>
</system.webServer>

Ответ 9

вы можете добавить что-то вроде этого:

RewriteCond %{REQUEST_URI} !^/csNewsAd 

но это не обязательно, потому что если csNewsAd действительно является каталогом (папкой), его не следует переписывать в первую очередь из-за

RewriteCond %{REQUEST_FILENAME} !-d

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

Ответ 10

Вы должны попробовать этот

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/(gadget)/(.*) /gadget/$2 [R]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Ответ 11

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

Ответ 13

Я знаю его старый пост, но он все еще помог мне. У меня была дополнительная проблема нескольких блоков RewriteRules:

##
## White listed folders
##
RewriteCond %{REQUEST_URI} !^/(phplist|phplist/.*)$
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} !/.well-known/*
RewriteCond %{REQUEST_FILENAME} !/storage/app/uploads/.*
RewriteCond %{REQUEST_FILENAME} !/storage/app/media/.*
...
RewriteCond %{REQUEST_FILENAME} !/modules/.*/(assets|resources)/.*
RewriteRule !^index.php index.php [L,NC]

##
## Block all PHP files, except index
##
RewriteCond %{REQUEST_URI} !^/(phplist|phplist/.*)$
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteRule !^index.php index.php [L,NC]

##
## Standard routes
##
RewriteCond %{REQUEST_URI} !^/(phplist|phplist/.*)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

и должен был добавить мою RewriteCond перед каждым блоком...