#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
.