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

Apache: Open same .php file with any URN (abc.com/<blabla>), но оставьте URL</blabla>

В основном я нашел здесь часть своего решения: Правило перезаписи Apache и сохранить URL-адрес без изменений?

но я хочу сделать больше.

Я хочу открыть сайт template.php, который появляется при любом введенном URN. Итак, если я открою abc.com/blabla, откроется шаблон, а URL-адрес останется abc.com/blabla. Если я введу abc.com/lalala, откроется шаблон, а URL-адрес останется abc.com/lalala.

Думаю, это то, что я хочу:

RewriteRule ^/$       /template.php

Кроме того, я хочу, чтобы мой основной сайт abc.com открывал index.php, а также использовал перезапись для https, что мне нравится:

    RewriteEngine   On
    RewriteCond     %{HTTPS} !=on
    RewriteRule     ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Как я могу добиться того и другого в одной конфигурации? Разве часть https не портит часть URN?

RewriteRule ^/$       /template.php

Предполагая, что эта директива находится в сервер или виртуальный хост контекст (т.е. не каталог или .htaccess context), то это будет соответствовать запросам только для корня документа (т.е. /) и игнорировать /blabla и /lalala.

Чтобы соответствовать <anything>, Кроме index.php (или пустой URL-путь, предполагая index.php установлен как DirectoryIndex), то вместо этого выполните что-то вроде следующего:

 RewriteRule ^/(index\.php|template\.php)?$ - [L]
 RewriteRule ^ /template.php [L]

Первое правило останавливает дальнейшую обработку, если / или /index.php или /template.php запрашивается, что позволяет вашему основному сайту (т.е. index.php) для доступа и предотвращает цикл перезаписи.

Второе правило перезаписывает все остальные URL-адреса (независимо от того, сопоставляются ли они напрямую с ресурсами файловой системы или нет), чтобы /template.php.

Необычно то, что вы не хотите, чтобы статические ресурсы (изображения, CSS, JS и т. Д.) Были исключены из этой перезаписи, но вы подтвердили это в комментариях.

RewriteEngine   On
RewriteCond     %{HTTPS} !=on
RewriteRule     ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Поскольку вы находитесь в конфигурации основного сервера (т.е. не .htaccess), то вам не следует использовать mod_rewrite для перенаправления HTTP на HTTPS. У вас должен быть простой mod_alias Redirect в неканонических <VirtualHost *:80> контейнер.

Разве часть https не портит часть URN?

Нет. (Чтобы ответить на этот конкретный вопрос - если вы использовали mod_rewrite.)

Это, конечно, при условии, что у вас есть директивы в правильном порядке. Сначала должно появиться внешнее перенаправление с HTTP на HTTPS.