Добавление RewriteRule в , чтобы разрешить ссылку для привязки раздела на той же странице

Раньше я размещал свои веб-сайты на стороннем хостинге, и привязать ссылки всегда было легко. Тогда я решил установить свой VPS. Все работает хорошо, кроме якорных ссылок.

Я обнаружил, что Apache по умолчанию не позволяет мне использовать некоторые символы при доступе к URL-адресам, но также можно использовать mod_rewrite для решения этой проблемы. Согласно документации Apache, когда я могу выбрать между добавлением правил перезаписи через вместо использования файлов .htaccess , я должен это сделать.Кроме того, для включения механизма перезаписи необходимо включить параметры RewriteEngine On и FollowSymLinks . Учитывая, что я уже использую RewriteRules для принудительного доступа через HTTPS (и это работает), я считаю, что моя система готова получать RewriteRules.

Поэтому я добавил правило перезаписи в , но оно не достигает ожидаемого результата. Вместо доступа к mydomain.com/pageA/sectionB доступ к привязке mydomain.com/pageA#sectionB . Возможно, я добавляю RewriteRule не в то место, поскольку я нашел в документации Apache это правило, которое делает именно то, что я ожидаю. Я делаю что-то неправильно? Следуйте за моим файлом ".conf".

<VirtualHost *:80> 
  Servername mydomain.com 
  ServerAlias www.mydomain.com 

  RewriteEngine on 
  RewriteCond %(SERVER_NAME) =mydomain.com [OR] 
  RewriteCond %(SERVER_NAME) =www.mydomain.com 
  RewriteRule https://%{SERVER_NAME}%{REQUEST_URI} [END=301,L] 
</VirtualHost> 

<VirtualHost _default_:443> 
  ServerAdmin admin@mydomain.com 
  DocumentRoot /var/www/html/mydomain.com/ 
  ServerName mydomain.com 
  ServerAlias www.mydomain.com 

<Directory /var/www/html/mydomain.com/> 
  Options Indexes FollowSymLinks MultiViews 
  AllowOverride ALL 
  Order allow,deny 
  Allow from all 

  RewriteEngine on 
  RewriteRule "^/pageA/sectionB/" "/pageA#sectionB/" [NE,R]
</Directory> 

ErrorLog ${APACHE_LOG_DIR}/error.log 
CustomLog ${APACHE_LOG_DIR}/access.log combined 

SSLEngine on 
SSLCertificateFile /etc/ssl/certs/my_certificate.cer 
SSLCertificatekeyFile /etc/ssl/private/my_key.key 

</VirtualHost> 
0
задан 5 May 2020 в 12:05

1 ответ

RewriteRule "^/pageA/sectionB/" "/pageA#sectionB/" [NE,R]

Эта директива не будет соответствовать при использовании в контексте directory (т.е. внутри контейнера или .htaccess), из-за префикс косой черты в URL-пути, который вы пытаетесь сопоставить. В контексте каталога префикс каталога (который всегда заканчивается косой чертой) сначала удаляется из URL-пути, которому соответствует директива RewriteRule, поэтому URL-путь никогда не начинается с косой черты.

По сути, вам просто нужно удалить префикс косой черты:

RewriteRule ^pageA/sectionB/ /pageA#sectionB/ [NE,R,L]

Я также удалил кавычки вокруг аргументов (они строго необходимы только в том случае, если аргумент содержит неэкранированные пробелы, в противном случае он просто немного сложнее читать ИМО). Хорошей практикой является всегда включать флаг L для внешних перенаправлений, хотя в настоящее время это последнее правило, поэтому оно не имеет большого значения (за исключением случаев, когда вы добавите больше правил позже).


ИЛИ вы перемещаете это правило непосредственно внутрь контейнера (т. е. контекст virtualhost). В этом случае директива RewriteRule сопоставляется с относительным корневым URL-путем, который включает префикс косой черты.

В данном случае это было бы предпочтительнее, так как любой .htaccess mod_rewrite директивы переопределяют контейнер , а ваша директива RewriteRule в контейнере не будет обрабатываться (если не будет наследования mod_rewrite включено - по умолчанию отключено).

Поскольку вы установили AllowOverride ALL в контейнере , предполагается, что у вас есть (или, по крайней мере, потенциальная возможность) .htaccess. файл, который может содержать директивы mod_rewrite. Если вы отключите переопределение .htaccess (например, AllowOverride None), то это не имеет значения.


Кроме того:

RewriteEngine on
RewriteCond %(SERVER_NAME) =mydomain.com [ИЛИ]
RewriteCond %(SERVER_NAME) =www.mydomain.com
Правило перезаписи https://%{SERVER_NAME}%{REQUEST_URI} [END=301,L]

Это (перенаправление с HTTP на HTTPS) совершенно неверно/искажено. У вас отсутствует аргумент RewriteRule pattern (первый), а аргумент flags имеет неверный формат. Они должны читаться [R=301,L].

Однако вам не нужно использовать mod_rewrite здесь, при использовании внутри контейнера простой директивы mod_alias Redirect достаточно и предпочтительнее.

Если вы также не внедряете HSTS, вам также следует перенаправить на каноническое имя хоста:

Например:

Redirect 301 / https://example.com/
0
ответ дан 3 July 2020 в 23:36

Другие вопросы по тегам:

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