У меня есть это рабочее правило:
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
.
Значит, корень документа добавляется неправильно, и я не знаю, как изменить правило для этого.
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.)