Назад | Перейти на главную страницу

Смешивание DBM Rewrite и Redirect, как остановить Rewrite, если url отсутствует в списке

Сценарий: мне нужно иметь возможность как перенаправлять определенные URL-адреса, так и переписывать другие URL-адреса

Прямо сейчас, после долгой работы, я могу заставить почти все работать

Если я ударил example.com работает нормально и 200

Если я ударил example.com/testrea текст из example.com/test11/ucm25685.htm отображается и 200

Если я ударил example.com/retest111/totest11.htm перенаправление на example.com/test1/ucm12347.htm происходит, но я получаю 403 Forbidden

Как мне остановить 403 Forbidden? Я думаю, что знаю, почему это происходит, но не могу понять, как это остановить. Если я отключу часть перезаписи, перенаправление сработает и не отобразит 403 запрещено.

Почему происходит ошибка 403 Forbidden, как видно из журналов, когда запрашивается страница, а не в таблице примеров RewriteMap (rewrite.dbm). Он отправляет /. Который, как я думал, был бы отсутствующим индексом, однако добавив -Indexes к Options не сделал никаких изменений, и / есть index.htm, который определен в vhost.

Вопрос в том, когда делается запрос, как я могу не переписать, если URL-адреса нет в файле examplemap (rewrite.dbm) RewriteMap?

Или есть лучший способ смешивать перезаписи и перенаправления, имея в виду, что это только для POC в производстве. У меня будет пара сотен перезаписей или перенаправлений, и файлы dbm будут обновляться по мере перемещения новых страниц.

Перезапись предупреждений LogLevel вывода журнала: trace3

example.com

[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] init rewrite engine with requested uri /
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] applying pattern '^(.*)' to uri '/'
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] applying pattern '^(.*)' to uri '/'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] rewrite '/' -> '/index.htm'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] local path result: /index.htm
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] prefixed with document_root to /var/www/sites/me/index.htm
[DATE] [rewrite:trace1] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56079] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f697290/initial] go-ahead with /var/www/sites/me/index.htm [OK]

example.com/testrea

[DATE] [rewrite:trace2] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] init rewrite engine with requested uri /testrea
[DATE] [rewrite:trace3] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] applying pattern '^(.*)' to uri '/testrea'
[DATE] [rewrite:trace3] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] applying pattern '^(.*)' to uri '/testrea'
[DATE] [rewrite:trace2] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] rewrite '/testrea' -> '/test11/ucm25685.htm'
[DATE] [rewrite:trace2] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] local path result: /test11/ucm25685.htm
[DATE] [rewrite:trace2] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] prefixed with document_root to /var/www/sites/me/test11/ucm25685.htm
[DATE] [rewrite:trace1] [pid 10407] mod_rewrite.c(470): [client 55.66.77.88:56111] 55.66.77.88 - - [example.com/sid#55ac8f2ead48][rid#55ac8f698700/initial] go-ahead with /var/www/sites/me/test11/ucm25685.htm [OK]

example.com/retest111/totest11.htm

[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] init rewrite engine with requested uri /retest111/totest11.htm
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] applying pattern '^(.*)' to uri '/retest111/totest11.htm'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] rewrite '/retest111/totest11.htm' -> '/test1/ucm12347.htm'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] explicitly forcing redirect with http://example.com/test1/ucm12347.htm
[DATE] [rewrite:trace1] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] escaping http://example.com/test1/ucm12347.htm for redirect
[DATE] [rewrite:trace1] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f69f2d0/initial] redirect to http://example.com/test1/ucm12347.htm [REDIRECT/301]
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] init rewrite engine with requested uri /test1/ucm12347.htm
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] applying pattern '^(.*)' to uri '/test1/ucm12347.htm'
[DATE] [rewrite:trace3] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] applying pattern '^(.*)' to uri '/test1/ucm12347.htm'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] rewrite '/test1/ucm12347.htm' -> '/'
[DATE] [rewrite:trace2] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] local path result: /
[DATE] [rewrite:trace1] [pid 10412] mod_rewrite.c(470): [client 55.66.77.88:56126] 55.66.77.88  - - [example.com/sid#55ac8f2ead48][rid#55ac8f691260/initial] go-ahead with / [OK]

Текущий макет Webroot

test1/ucm12347.htm
test2/ucm23452.htm
test3/ucm34674.htm
test4/ucm43489.htm
test5/ucm10963.htm

test11/ucm25685.htm
test22/ucm87546.htm
test33/ucm32548.htm
test44/ucm95142.htm
test55/ucm56485.htm

/retest111/totest11.htm
/retest222/totest22.htm
/retest333/totest33.htm
/retest444/totest44.htm
/retest555/totest55.htm

2 текстовых файла, конвертируемых в файлы DB и DBM:

rewrite.txt

httxt2dbm -i rewrite.txt -o rewrite.dbm

/ index.htm
/testrea test11/ucm25685.htm
/testreb test22/ucm87546.htm
/testrec test33/ucm32548.htm
/testred test44/ucm95142.htm
/testree test55/ucm56485.htm

redirects.txt

httxt2dbm -f db -i redirects.txt -o redirects.db

/retest111/totest11.htm test1/ucm12347.htm
/retest222/totest22.htm test2/ucm23452.htm
/retest333/totest33.htm test3/ucm34674.htm
/retest444/totest44.htm test4/ucm43489.htm
/retest555/totest55.htm test5/ucm10963.htm

В httpd.conf у меня есть глобальная перезапись

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteMap examplemap "dbm:/etc/httpd/conf/rewrite.dbm"
    RewriteRule ^(.*) /${examplemap:$1}
</IfModule>

И отдельный виртуальный хост

<VirtualHost *:80>
    DocumentRoot /var/www/sites/me
    ServerName example.com
    DirectoryIndex index.htm
    ErrorDocument 404 /index.php
    Options +FollowSymLinks
    RewriteEngine On
    RewriteOptions Inherit
    RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
    RewriteCond ${redirects:$1} !=""
    RewriteRule ^(.*) /${redirects:$1} [redirect=permanent,last]
</VirtualHost>

Я думаю, что 403 срабатывает, потому что ваш DirectoryIndex документ (т.е. index.htm) не существует. Однако это лишь конечный результат реальной основной проблемы ... безусловно переписывание на возвращаемое значение вашего пример карты RewriteMap (который может быть «пустым»). Я подозреваю, что вы увидите тот же результат, если попросите example.com/test1/ucm12347.htm напрямую или любой URL, который не существует в вашем пример карты RewriteMap.

Когда поиск не найден в вашем пример карты RewriteMap (который просматривается по каждому запросу, который не перенаправить), тогда вы переписываете на / (корень документа), потому что результат, возвращаемый вашей картой перезаписи, пуст. Это вызовет запуск mod_dir для обслуживания DirectoryIndex. Если DirectoryIndex документ не существует и Indexes вариант не включен, то вы получите 403 Forbidden.

Вы решили эту проблему своим перенаправляет RewriteMap создавая состояние который сначала проверяет возвращаемое значение из RewriteMap. Вам нужно будет сделать что-то подобное со своим пример карты RewriteMap. Например:

RewriteMap examplemap "dbm:/etc/httpd/conf/rewrite.dbm"
RewriteCond ${examplemap:$1} !=""
RewriteRule ^(.*) /${examplemap:$1} [L]

Альтернатива:

RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*) /${redirects:$1} [redirect=permanent,last]

Вы можете сохранить результат RewriteMap поиск в переменной среды, чтобы избежать многократных поисков (в состояние и RewriteRule замена). Хотя результаты RewriteMap поиск кэшируются, поэтому пользы от этого нет. Например:

RewriteRule (.*) - [E=REDIRECT_TO:${redirects:$1}]
RewriteCond %{ENV:REDIRECT_TO} .
RewriteRule ^ /%{ENV:REDIRECT_TO} [redirect=permanent,last]