Я хочу точно соответствовать URL, который включает запятую, в блоке местоположения nginx. Ссылка была сформирована неправильно из двух URL-адресов, разделенных запятыми, и я хотел бы перенаправить ее на правильный (первый) URL-адрес, а не возвращать ошибку 404.
Это то, что я попробовал сначала:
location = /page_one,page_two {
return 301 https://example.com/page_one;
}
Я также пытался отделить запятую косой чертой \,
и кодировать ее как % 2C
и все вышеперечисленное с URL в двойных кавычках.
Я бы предпочел точное решение совпадения, если это возможно, а не префикс или регулярное выражение совпадения.
-121--308475-Я хочу, чтобы содержимое каталога «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», но для некоторых файлов в каталоге.
Но когда я сейчас пытаюсь создать 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 имеет только параметр наследования
.)