Я хочу разрешить только 2 вещи в .htaccess:

  • /favicon.ico -> доставить файл

  • /<anythingelse> -> index.php

Следовательно, /logs/mylog.log и /hello.py должны перейти в index.php, а не отображать необработанное содержимое этих файлов (которые существуют!).

Как сделать такой .htaccess?


Я старался:

Решение №1 (кажется, создает бесконечный цикл):

RewriteEngine On
RewriteCond %{REQUEST_URI} !favicon\.ico$
RewriteRule ^(.*)$ index.php

Решение №2 (предоставляет файлы /logs/mylog.log и /hello.py, этого не должно происходить!):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !favicon\.ico$
RewriteRule ^(.*)$ index.php
1
Basj 10 Янв 2017 в 20:52

1 ответ

Лучший ответ

Это сделает это:

RewriteEngine On
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteCond %{REQUEST_URI} !=/index.php
RewriteRule ^ index.php

Удалены строки, проверяющие, был ли это существующий файл или каталог, так как вы хотите, чтобы они тоже были переписаны.

Добавлена ​​проверка, что это еще не index.php, чтобы избежать цикла.

Изменен синтаксис RewrieCond на простое сравнение, которое более разборчиво.

Добавлен косая черта в начале URI запроса, иначе они не будут совпадать.

Удален захват в RewriteRule, который вы не используете.

Обновить

При дальнейшем обсуждении в комментариях, это должно работать, когда копия файла .htaccess помещается в подкаталог. Вот обновление, которое будет работать:

RewriteEngine On
RewriteRule !^(?:favicon\.ico|index\.php)$ index.php [END]

Директивы RewriteCond нельзя было использовать без добавления к ним имени каталога, поскольку /index\.php$ был опцией, но также соответствовал файлу в подкаталоге. Вышеупомянутое достигает цели без необходимости обновлять при копировании, хотя и не очень красиво.

2
10 Янв 2017 в 22:22
Почему косая черта в !=/index.php? index.php не всегда находится в корне моего веб-сайта. т.е. будет ли он работать как для example.com/mywebsite/index.php, так и для example.com/index.php?
 – 
Basj
10 Янв 2017 в 21:11
/mywebsite/index.php будет переписан в /index.php, как и все остальное. Вы имеете в виду, что хотите, чтобы index.php был специфичным для каждого каталога? Значит, все в каталоге переписывается на index.php в этом каталоге? Это совсем другая, более сложная вещь, и я могу обновить свой ответ, если это так.
 – 
user2493235
10 Янв 2017 в 21:14
Допустим, у меня есть example.com/anotherwebsite/ (здесь не важно) и example.com/mywebsite/, который содержит example.com/mywebsite/.htaccess, о котором я говорю. Тогда я хочу, чтобы example.com/mywebsite/ перенаправлялся не на example.com/index.php, а на example.com/mywebsite/index.php.
 – 
Basj
10 Янв 2017 в 21:38
Хорошо, конечно, поэтому он должен работать в подкаталоге, но только тогда, когда туда помещен файл htaccess. В противном случае все, что находится в подкаталоге, будет перезаписано в index.php в каталоге самого низкого уровня с файлом htaccess. Я обновил ответ, чтобы сделать это. Флаг END важен, иначе он будет перезаписан файлом htaccess выше по структуре каталогов.
 – 
user2493235
10 Янв 2017 в 22:12