htaccess RewriteRule кажется правильным, но не работает

#.htaccess #rewrite

#.htaccess #url-перезапись

Вопрос:

Я хочу перенаправить весь трафик, идущий в любой файл .php, на index.php.

Например:
domain.com/test.php
domain.com/test/test.php
.. следует перейти к domain.com/index.php. Аналогично:
www.domain.com/test.php
www.domain.com/test/test.php
.. следует перейти к www.domain.com/index.php.

Я добавил следующее правило:

RewriteRule (..com)(/.)?/(.*.php) $1/index.php

который, согласно онлайн-тестеру регулярных выражений, должен дать мне правильный результат, но когда я использую его в реальном htaccess, правило, похоже, игнорируется, и вместо этого выдается ошибка 404.

Что я делаю не так?

Ответ №1:

RewriteRule не совпадает с host по своему первому параметру. Попробуйте следующее:

 RewriteEngine on

RewriteCond %{REQUEST_URI} index.php$
RewriteCond %{QUERY_STRING} arg=something
RewriteRule .php$ /index.php? [R]

RewriteCond %{REQUEST_URI} !index.php$
RewriteRule .php$ /index.php? [R]
  

Надеюсь, это поможет.

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

1. Спасибо за вашу помощь, но, к сожалению, это все еще не работает, это просто выдает ошибку 404 вместо перенаправления на index.php.

2. Есть идеи, почему это так? Или если есть какой-либо другой подход, который я должен предпринять?

3. Выполняет ли ваш index.php для файла выполняется перенаправление любого типа или у вас есть другие правила в вашем .htaccess ? Правило должно работать, есть ли у вас доступ к основной конфигурации apache для включения RewriteLog , в противном случае вы подтвердили, что mod_rewrite это включено? Кроме того, я добавил условие, позволяющее избежать цикла перенаправления, о котором я забыл прошлой ночью, а также правило для проверки аргументов querystring index.php .

4. Кроме того, в конце ? правил удаляются строки запросов, если вы хотите, чтобы они поддерживались через перенаправление, просто удалите ?

Ответ №2:

Попробуйте этот код:

 Options  FollowSymlinks -MultiViews
RewriteEngine on

# internally redirect all .php files to index.php
RewriteCond %{REQUEST_URI} !^/ index.php [NC]
RewriteRule .php$ /index.php? [L,NC]

# remove all query string from /index.php
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^index.php$ /index.php? [L,R]
  

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

1. Привет, спасибо за ваш совет, но опять же, к сожалению, он возвращается только с ошибкой 404, вместо того, чтобы фактически переписать URL для перехода index.php. Есть идеи, почему это так? У меня также есть куча блоков spambot и IP-блоков, которые также не работают. Могут ли они быть связаны?

2. Это вполне может быть так. Я бы посоветовал, пожалуйста, изучить ваш доступ. войдите, чтобы увидеть, что вы получаете, зачем загружать этот URL.

3. Также не могли бы вы скопировать / вставить код еще раз из моего ответа выше. Я внес незначительную правку.

4. Привет, анубхава, еще раз спасибо за предложения. Страница по-прежнему возвращает ошибку 404. Причина этого мода в том, что наш сайт был недавно взломан, и я пытаюсь перенаправить 404 запроса на предыдущий спам-файл php на index.php. Я также хотел сделать, например, /index.php?arg=something, чтобы также вернуть index.php , но я не знаю, как это сделать. Очень ценю вашу помощь.

5. Извините за поздний ответ, пришлось лечь спать, так как было очень поздно. Я только что отредактировал свой ответ выше, чтобы отбросить всю строку запроса из /index.php как вы просили.