Как избежать/кодировать запятую в блоке местоположения nginx

Я хочу точно соответствовать URL, который включает запятую, в блоке местоположения nginx. Ссылка была сформирована неправильно из двух URL-адресов, разделенных запятыми, и я хотел бы перенаправить ее на правильный (первый) URL-адрес, а не возвращать ошибку 404.

Это то, что я попробовал сначала:

location = /page_one,page_two {
    return 301 https://example.com/page_one;
}

Я также пытался отделить запятую косой чертой \, и кодировать ее как % 2C и все вышеперечисленное с URL в двойных кавычках.

Я бы предпочел точное решение совпадения, если это возможно, а не префикс или регулярное выражение совпадения.

-121--308475- Правила перезаписи Apache не работают после исключения каталога из аутентификации Я хочу, чтобы содержимое каталога «dir» было защищено, но если пользователь обращается к самому каталогу, я хочу, чтобы вместо этого был использован PHP-файл из родительского каталога. Это работает со следующими...

Я хочу, чтобы содержимое каталога «dir» было защищено, но если пользователь обращается к самому каталогу, я хочу, чтобы вместо этого был использован PHP-файл из родительского каталога. Это работает со следующей конфигурацией:

<VirtualHost *:80>

    LogLevel debug
    
    DocumentRoot "/var/www/html"
    ServerName example.com
    
    <Directory /var/www/html>
    
        SetEnvIf Request_URI "dir/$" allow  
        Order allow,deny
        Allow from env=allow
        Satisfy any
    
        RewriteEngine on
        RewriteRule dir index.php?id=dir [QSA,L]    
    </Directory>
    
    <Directory /var/www/html/dir>
        Require user valid-user 
        AuthName "Restricted"
        AuthType Basic
        AuthUserFile /etc/apache2/.htpasswd
        
        #RewriteEngine on
    </Directory>

</VirtualHost>

При доступе к «example.com/dir» отображается содержимое index.php, при доступе к «example.com/dir/file.html» необходимо сначала выполнить аутентификацию. Все так, как хотелось.

Но когда я пытаюсь создать правила RewriteRules для других файлов, я прекращаю работу. Когда я просто раскомментирую строку «# RewriteEngine on» в конце, я получаю 404 не найден, когда я пытаюсь получить доступ к «» example.com/dir.

Почему это происходит? Мне не нужны другие правила переписывания для самого «dir», но для некоторых файлов в каталоге.

2
задан 28 January 2021 в 02:23
1 ответ

Но когда я сейчас пытаюсь создать RewriteRules для других файлов, я перестаю работать. Когда я просто раскомментирую строку «#RewriteEngine on» в конце, я получаю 404 not found, когда пытаюсь получить доступ к «example.com/dir».

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

Чтобы решить эту проблему, как вы ее написали, вам необходимо включить наследование mod_rewrite. Однако директивы mod_rewrite по существу копируются на месте, когда они «наследуются», и опубликованная вами директива не будет работать, если она будет включена в контейнер , поскольку регулярное выражение dir не соответствует.

 RewriteRule dir index.php? Id = dir [QSA, L] 
 

Обратите внимание, что это не просто перезаписывает запросы к самому каталогу, он перезаписывает любой запрос, который просто содержит dir .

Чтобы сделать этот "наследуемым" (т.е. не зависящим от текущего каталога), измените его на следующее:

RewriteCond %{REQUEST_URI} ^/(dir)/?$
RewriteRule ^ /index.php?id=%1 [QSA,L]

И в контейнере , включить наследование mod_rewrite. Либо:

RewriteEngine On

# Parent directives are copied AFTER directives in the current scope
RewriteOptions Inherit

, либо

# Parent directives are copied BEFORE directives in the current scope
RewriteOptions InheritBefore

(Apache 2.2 имеет только параметр наследования .)

0
ответ дан 24 April 2021 в 00:23

Теги

Похожие вопросы