перенаправить все файлы с расширением .php - PullRequest
1 голос
/ 05 апреля 2011

имеют этот код в файле htaccess, чтобы скрыть окончательное расширение php каждого файла

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

, но теперь я хочу перенаправить на другую страницу, если пользователь пытается завершить расширение.

я пробовал эту строку после сценария выше, но я получаю внутреннюю ошибку 500

RewriteRule \.php$ - [R=404]

спасибо!

Ответы [ 3 ]

2 голосов
/ 05 апреля 2011

Ваши правила переписывания должны быть такими:

RewriteEngine on
Options +FollowSymlinks -MultiViews

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond  %{QUERY_STRING} !^myvar=0
RewriteCond %{REQUEST_URI} !\..*$
RewriteRule ^(.*)$ /$1.php?myvar=0 [QSA,L]

# but don't allow example.com/foo.php
RewriteCond  %{QUERY_STRING} !^myvar=0$
RewriteRule \.php$ - [R=404,L]

В основном первое правило добавляет фиктивный параметр запроса myvar=0 в URL, а второе проверяет его отсутствие, чтобы включить его, следовательно, если пользователь вводит /abc.php, то он блокируется, но если просто / abc, то это внутренне перенаправлен в /abc.php.

1 голос
/ 06 апреля 2011

Mod_rewrite принимает только значения 301 и 302 (по умолчанию, если не указано) для флага R.Если вы хотите отправить на 404, я бы порекомендовал отправить запрос на пользовательскую страницу 404: RewriteRule \.php$ /404.php [L], где 404.php устанавливает статус ответа 404.

0 голосов
/ 12 декабря 2015

Справочная документация сервера Apache: Apache 2.2 был выпущен в 2005 году - 10 лет назад. https://en.wikipedia.org/wiki/Apache_HTTP_Server

Apache 2.2 R Flag Код статуса ответа HTTP Справочная информация: https://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_r

Любой действительный код статуса ответа HTTP может быть указан с использованием синтаксиса [R = 305], с кодом состояния 302, используемым по умолчанию, если нет указано. Указанный код состояния не обязательно должен быть код состояния перенаправления (3xx). Однако, если код состояния находится за пределами диапазон перенаправления (300-399), затем строка замещения удаляется полностью, и перезапись прекращается, как если бы использовались буквы L.

Apache 2.4 R Флаг HTTP код ответа Справочная информация: https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r

Любой действительный код статуса ответа HTTP может быть указан с использованием синтаксиса [R = 305], с кодом состояния 302, используемым по умолчанию, если нет указано. Указанный код состояния не обязательно должен быть код состояния перенаправления (3xx). Однако, если код состояния находится за пределами диапазон перенаправления (300-399), затем строка замещения удаляется полностью, и перезапись прекращается, как если бы использовались буквы L.

Дополнительная информация:

"Цель (или строка подстановки) в RewriteRule считается путь к файлу по умолчанию. "

"- (тире) Тире указывает на то, что подстановка не должна выполняться (существующий путь пропущен через нетронутым). Это используется, когда необходимо применить флаг (см. Ниже) без изменения пути. "

В простом английском языке строка подстановки - это путь http URI, где вы также переписываете или перенаправляете. Это означает, что при использовании диапазона перенаправления 4xx, такого как R = 405, целевой путь URI будет игнорироваться / не разрешаться / не использоваться, если он присутствует в RewriteRule.

Этот RewriteRule действителен и работает в большинстве случаев / для большинства серверов / конфигурации сервера, но может работать не в каждом отдельном случае, так что если вам нужно что-то, что работает в 100% всех конфигураций сервера, то вы бы потеряли этот код и не использовать R = 405. В живом тестировании R = 405 работает в 99,99% всех случаев на хостах по всему миру.

RewriteCond %{REQUEST_METHOD} ^(HEAD) [NC]
RewriteRule ^(.*)$ - [R=405,L]

Код не указан:

RewriteCond %{REQUEST_METHOD} ^(HEAD) [NC]
RewriteRule ^(.*)$ /path-to-405-error-logging-file/405.php [L]
...