Apache .htaccess устанавливает заголовок, если URI запроса не совсем соответствует желаемому значению

Цель: использование файла .htaccess в / directory /, если URI запроса НЕ точно соответствует« / directory / », тогда установите заголовок. Например, заголовок ДОЛЖЕН быть установлен, если URI запроса - «/directory/index.php», «/ directory /? Something» или «/directory/index.php?something», но НЕ ДОЛЖЕН быть установлен, если запрос URL - это в точности "/directory/"

Apache/2.4.41, поэтому директива IF доступна.

Основные две методологии, которые я пробовал:

<If "%{REQUEST_URI} != '/directory/'">
 Header always set X-Robots-Tag "noindex"
</If>
SetEnvIf Request_URI "/directory/" isgood
Header always set X-Robots-Tag "noindex" env=!isgood

Я пробовал несколько вариантов, например, используя" ранний "в заголовке, а также попытки сопоставить только" / "на основе прошлого опыта, когда при работе в контексте .htaccess он может не" видеть "полный URI.

Все попытки приводят к тому, что заголовок ВСЕГДА оказывается установлен или НИКОГДА не устанавливается.

(Да, mod_header и mod_setenvif включены)

Я настроил это для тестирования, пробуя сразу несколько разных методов с разными заголовками:

<If "%{REQUEST_URI} != '/'">
        Header always set X-Test1 "test1"
</If>

<If "%{REQUEST_URI} != '/files/crackypics/2005-January-alt/'">i
        Header always set X-Test2 "test2"
</If>

SetEnvIf Request_URI "/" test3
Header always set X-Test3a "test3a" env=!test3
Header always set X-Test3b "test3b" env=test3

SetEnvIf Request_URI "/files/crackypics/2005-January-alt/" test4
Header always set X-Test4a "test4a" env=!test4
Header always set X-Test4b "test4b" env=test4

Независимо от фактического URI запроса, я всегда получай тест t1, test2, test3b и test4b.

0
задан 17 May 2021 в 06:11
2 ответа

Я довольно близко подошел к тому, чем хотел заниматься.

Использование REQUEST_URI было ошибкой, потому что mod_dir незаметно манипулирует им.

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

Это то, к чему я пришел:

Header always set X-Robots-Tag "noindex" "expr=%{THE_REQUEST} !~ m#/ HTTP#"

THE_REQUEST будет выглядеть примерно так в «хорошем» запросе (запрос, для которого я не хочу устанавливать заголовок):

"GET /directory/ HTTP/2.0"

My RegEx ищет "/ HTTP », и если он НЕ совпадает, он устанавливает заголовок

. Если запрос заканчивается чем-то другим, кроме / (« /index.php »,« /? Something »и т. Д.), Он устанавливает заголовок.

0
ответ дан 28 July 2021 в 14:07

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

Я запустил тестовый сервер и определил в корневом каталоге документов каталог с именем test , внутри этого тестового каталога я поместил файл (test.file) , поэтому, когда я запрашиваю каталог, я получаю одно значение заголовка, а когда я запрашиваю файл, я получаю другое значение заголовка, как в случае с тестом, который вы пытаетесь.

Я определил это в .htaccess:

<If "%{REQUEST_URI} =~ m#^/test/$#">
        Header always set X-Test1 "testdir"
</If>
<Else>
        Header always set X-Test1 "testfile"
</Else>

И когда я протестировал, он сразу заработал:

$ curl -Ik http://192.168.1.10:8090/test/file.html
HTTP/1.1 200 OK
Date: Fri, 18 Feb 2067 22:28:14 GMT
Server: Apache
X-Test1: testfile <----
Last-Modified: Mon, 17 May 2021 20:04:13 GMT
ETag: "a-5c28c18f65152"
Accept-Ranges: bytes
Content-Length: 10
Content-Type: text/html

curl -Ik http://192.168.1.10:8090/test/
HTTP/1.1 404 Not Found
Date: Fri, 25 Feb 2067 13:45:34 GMT
Server: Apache
X-Test1: testdir <---
Content-Type: text/html; charset=iso-8859-1

Хотя, Если у меня включен DirectoryIndex в этом каталоге, это засчитывается, поскольку вы загружаете файл ( index.html по умолчанию) :

curl -Ik http://192.168.1.10:8090/test/
HTTP/1.1 200 OK
Date: Tue, 22 Feb 2067 06:06:54 GMT
Server: Apache
X-Test1: testfile <---
Last-Modified: Mon, 17 May 2021 20:12:48 GMT
ETag: "9-5c28c37a406a4"
Accept-Ranges: bytes
Content-Length: 9
Content-Type: text/html

Итак, если вы загружаете файл directoryindex, вам, вероятно, придется исключить его из первого теста для каталога с другим условием. Например:

<If "%{REQUEST_URI} =~ m#^/test/$#">
        Header always set X-Test1 "testdir"
</If>
<ElseIf "%{REQUEST_URI} =~ m#^/test/index.html$#">
        Header always set X-Test1 "testdir"
</ElseIf>
<Else>
        Header always set X-Test1 "testfile"
</Else>

И вы получите желаемый эффект:

$ curl -Ik http://192.168.1.10:8090/test/
HTTP/1.1 200 OK
Date: Fri, 11 Feb 2067 12:58:38 GMT
Server: Apache
X-Test1: testdir
Last-Modified: Mon, 17 May 2021 20:12:48 GMT
ETag: "9-5c28c37a406a4"
Accept-Ranges: bytes
Content-Length: 9
Content-Type: text/html

Надеюсь, это поможет.

1
ответ дан 28 July 2021 в 14:07

Теги

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