Apache Redirect без включения корня документа в правило перезаписи

У меня есть это рабочее правило:

RewriteRule ^(.*)/amp/$ https://example.com/$1?amp=1 [QSA,R=301,NC,NE,L]

Для перенаправления https://example.com/register/amp/ на https://example.com/ register? amp = 1 .

И он работает хорошо, но я бы хотел, чтобы URL-адрес в браузере не менялся, чтобы он загружал регистр ? amp = 1 , но в браузере по-прежнему отображается / register / amp / .

Чтобы добиться такого поведения, я пытаюсь изменить на:

RewriteRule ^(.*)/amp/$ ./app.php/$1?amp=1 [QSA,R=301,NC,NE,L]

Но затем он перенаправляется на https://example.com/home/ user / public_html / register? amp = 1 .

Значит, корень документа добавляется неправильно, и я не знаю, как изменить правило для этого.

1
задан 4 May 2019 в 04:10
1 ответ
RewriteRule ^(.*)/amp/$ ./app.php/$1?amp=1 [QSA,R=301,NC,NE,L]

Необходимо снять флаг R (внешнее "перенаправление"). Префикс ./ в строке substitution также здесь лишний и просто добавляет сложности, которую операционная система должна оптимизировать.

Когда вы указываете относительный путь substitution в контексте каталога (. htaccess или <Каталог> в конфигурационном файле сервера) и вы не указали альтернативный префикс (или "базовый" каталог) с директивой RewriteBase, то Apache в конце процесса перезаписи добавляет обратно каталог-префикс (т.е. /home/user/public_html/ в конце процесса перезаписи. Именно из-за того, что это внешний редирект, вы подвергаете этот каталог-префикс вредоносному редиректу. Вместо этого вам нужен внутренний редирект.

Например:

RewriteRule ^(.*)/amp/$ app.php/$1?amp=1 [QSA,NC,NE,L]

Однако, вы также включили app.php в substitution, который вы не показали в ваших целевых URL? (app.php, возможно, верно - вы должны переписать в реальный путь файловой системы и не полагаться на дополнительные переписывания или подзапросы по mod_dir.)

.
1
ответ дан 3 December 2019 в 23:05

Теги

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