.htaccess будет только перенаправлять и не переписывать - PullRequest
0 голосов
/ 14 марта 2019

Я хочу переписать example.com/foo в example.com/index.php?bar (PHP codeigniter).

Все файлы находятся в одном домене.

В качестве исходногоуказать и доказать настройку, следующий код успешно перенаправляет:

RewriteCond %{HTTPS} on
RewriteRule ^foo/$ https://example.com/index.php?bar [L,QSA,NC]

Но я хочу переписать, а не перенаправить.Я не смог понять, как это сделать.Я пробовал следующее для RewriteRule:

#These don't work
RewriteRule ^foo1/$ index.php?/bar [L,QSA,NC]
RewriteRule ^foo2/$ /index.php?/bar [L,QSA,NC]
RewriteRule ^foo3/$ index.php?/bar [L,QSA,NC,P]
RewriteRule ^foo4/$ /index.php?/bar [L,QSA,NC,P]
RewriteRule ^foo5/$ index.php?/bar [L,QSA,NC,PT]
RewriteRule ^foo6/$ /index.php?/bar [L,QSA,NC,PT]
RewriteRule ^foo7/$ https://example.com/index.php?/bar [L,QSA,NC,PT]

Полный .htaccess здесь:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]


RewriteCond %{HTTPS} on
RewriteRule ^foo/$ https://example.com/index.php?/bar [L,QSA,NC]    #works but redirects
RewriteRule ^foo1/$ index.php?/bar [L,QSA,NC]
RewriteRule ^foo2/$ /index.php?/bar [L,QSA,NC]
RewriteRule ^foo3/$ index.php?/bar [L,QSA,NC,P]
RewriteRule ^foo4/$ /index.php?/bar [L,QSA,NC,P]
RewriteRule ^foo5/$ index.php?/bar [L,QSA,NC,PT]
RewriteRule ^foo6/$ /index.php?/bar [L,QSA,NC,PT]
RewriteRule ^foo7/$ https://example.com/index.php?/bar [L,QSA,NC,PT]
</IfModule>

1 Ответ

1 голос
/ 14 марта 2019

Вы думаете, что слишком сложно.Не усложняйте ситуацию:

RewriteEngine On

RewriteCond %{HTTPS} !on
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,QSA]

RewriteRule ^/?foo/?$ /bar [END]

Перенаправление с http на http должно быть выполнено в первую очередь, независимо от внутренней перезаписи.Вы должны держать это отдельно.

Это правило также будет работать в конфигурации хоста http-серверов или внутри файла динамической конфигурации (файл ".htaccess").Очевидно, что модуль перезаписи должен быть загружен внутри http-сервера и включен на хосте http.Если вы используете динамический файл конфигурации, вам нужно убедиться, что его интерпретация вообще включена в конфигурации хоста и находится в папке хоста DOCUMENT_ROOT.

В случае, если вы получили внутреннюю ошибку сервера (http status 500), используя приведенное выше правило, есть вероятность, что вы используете очень старую версию apache http server.В этом случае вы увидите определенный намек на неподдерживаемый флаг [END] в файле журнала ошибок http-серверов.Вы можете попытаться обновить или использовать более старый флаг [L], он, вероятно, будет работать так же в этой ситуации, хотя это немного зависит от ваших настроек.

И общее замечание: вам всегда следует размещать такие правила в конфигурации хоста http-серверов, а не использовать файлы динамической конфигурации (".htaccess").Эти динамические файлы конфигурации добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера.Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

...