Перенаправление с использованием mod_rewrite в file .conf не работает

#apache #redirect #mod-rewrite #url-rewriting #url-redirection

#apache #mod-перезапись #url-переписывание #перенаправление

Вопрос:

На моем сервере apache мне нужно перенаправить URL-адреса в файле .conf. В моем файле, http.conf расположенном в /etc/httpd/conf , одна из строк содержит следующую конфигурацию:

 Include conf.d/*.conf
  

В папке, на которую указывает настройка, в /etc/httpd/conf.d у меня есть файл с именем redirect.conf , внутри которого находится следующий код перенаправления:

 <IfModule mod_rewrite.c>
      Options  FollowSymLinks
      RewriteEngine On
      RewriteCond %{QUERY_STRING} ^PageSpeed=noscript$ [NC]
      RewriteRule ^/?abracar/?$ /abracar? [L,R=301]
      RewriteCond %{QUERY_STRING} ^PageSpeed=noscript$ [NC]
      RewriteRule ^/?presente/decoracao/teu-sorriso/?$ /presente/decoracao/teu-sorriso? [L,R=301]
      RewriteCond %{QUERY_STRING} ^p=2amp;PageSpeed=noscript$ [NC]
      RewriteRule ^/?acessorios/confeitaria.html/?$ /acessorios/confeitaria.html? [L,R=301]
</IfModule>
  

Этот код должен перенаправлять URL https://example.com/abracar?PageSpeed=noscript на https://example.com/abracar , но он не работает. Если я помещу этот код в свой .htaccess файл, он будет работать корректно, но из-за внешних факторов мне нужно поместить это перенаправление в отдельный .conf файл. Я попробовал несколько разных конфигураций, я уже много изучил об этом, но ничего, что могло бы помочь мне решить эту проблему. Заранее спасибо!

Ответ №1:

Я думаю, самым простым решением было бы полностью удалить строку запроса?!

Обратите внимание, что для QSD требуется Apache 2.4 или новее.

 <IfModule mod_rewrite.c>
  Options  FollowSymLinks
  RewriteEngine On
  RewriteCond %{QUERY_STRING} ^PageSpeed=noscript$ [NC]
  RewriteRule ^ %{REQUEST_URI} [QSD,L,R=301]
</IfModule>
  

Добавлена более обобщенная и простая для понимания (для людей) версия:

 <IfModule mod_rewrite.c>
  Options  FollowSymLinks
  RewriteEngine On
  RewriteCond %{QUERY_STRING} . 
  RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [QSD,L,R=301]
</IfModule>
  

. — обобщенная форма строки запроса, которая не равна NULL. и в RewriteRule теперь перечислены все части URL, но я бы придерживался ^%{REQUEST_URI} для реальной версии, потому что обе версии просто переписывают каждый URL для себя.

Комментарии:

1. Это не сработало… Версия моего apache 2.4.6, поэтому я думаю, что он должен работать нормально. Другое дело также в том, что с этим параметром будет перенаправляться не только URL-адрес, их несколько, я добавил несколько других примеров в вопросе.

2. Отредактировал мой ответ. Обобщения %{QUERY_STRING} должно быть достаточным. Просто добавил расширенную версию RewriteRule для уточнения. Но вышеупомянутое делает то же самое … или должно делать в любом случае: D

3. Это отлично работает в моем .htaccess файле, однако я не могу в нем, мне нужно поместить это в .conf файл перенаправления внутри /etc/httpd/conf.d , и помещение кода в этот .conf файл перенаправления не работает. AllowOverride All установлено в моем httpd.conf файле в дополнение к настройкам, описанным в вопросе, и даже тогда перенаправления не работают …

4. На всякий случай: ваш httpd.conf содержит строку Include conf.d /*.conf, и эта строка идет после того, как модуль включает? AllowOverride — это директива специально для каталогов. Так включен ли он в <Каталог XYZ>? Вы получаете какие-либо ошибки в error.log? Что происходит, когда вы активируете журнал перезаписи в error.log? Можете ли вы понять, почему правило не применяется? —> Как активировать протоколирование перезаписи. Перезапись предупреждения на уровне журнала: trace4 trace4 для получения почти максимальной информации (строки запроса регистрируются на уровне trace4 )

5. Да, мой httpd.conf файл содержит Include conf.d/*.conf строку, которая идет после RewriteEngine On вызова, и она идет перед <Directory XYZ> вызовом конфигурации. Что я нахожу странным, так это то, что я не получаю никаких ошибок ни в одном журнале, поэтому проблему становится несколько сложно найти. Я уже пробовал несколько конфигураций внутри <Directory XYZ> , с VirtualHost, но ничего не работает. Но, если я сделаю перенаправление, как показано в примере: RedirectMatch 301 /test https://example.com работает нормально в моем httpd.conf файле или в другом моем файле с перенаправлениями внутри conf.d .