MultiViews * слишком * терпим к плохим URL
Когда я включаю MultiViews, если я посещаю плохие URL, моя страница (index.php) все еще достигается, когда я хочу, чтобы пользователь получил ошибку 404 вместо этого. Я пытаюсь выяснить, как это исправить, не создавая правила в моем .htaccess
,
Например, "www.mydomain.com/index/ blah / blah", посещает index.php, но я хочу, чтобы он завершился сбоем из-за посторонних компонентов мусорного URL-адреса. Аналогично для "/contact/ blah / awuihda / hiu", которая показывает содержимое файла contact.php, должно выдаваться ошибка 404, поскольку "/ blah / awuihda / hiu" не существует.
Если я отключаю MultiViews, он работает нормально, но тогда я не могу сокращать URL столько, сколько хочу (например, не могу набрать "/ contact", чтобы вызвать "contact.php").
2 ответа
Я нашел решение, которое работает для меня.
Options -Indexes SymLinksIfOwnerMatch -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Источник: ссылка
Вы можете просто использовать следующее, чтобы .php
расширение не требуется, что является обычным подходом:
RewriteEngine on
# Remove .php if it's present with a 301 redirect
RewriteRule ^(.+)\.php$ $1 [R=301,L]
# If a request doesn't exist as a directory, file or symlink
# and it does exist with .php appended, rewrite to that
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]
Я знаю, что это добавляет правило .htaccess
но это единственное предложение, которое работает для всего, а также означает, что вы не попадаете в потенциально дублирующийся контент, позволяя обслуживать одно и то же с или без .php
(или действительно с чем-либо вообще тянущимся после этого, как в ваших примерах). Надеюсь, это полезно.
Он может войти в конфигурацию основного сервера, но потребуется изменить.