Ненавижу задавать этот вопрос, потому что его задавали миллион раз, но ответы никогда не кажутся удовлетворительными, и большинство тем кажется заброшенным без принятого ответа.
Вот именно то, что мне нужно сделать (плохие URL являются преднамеренными из-за низкой кармы):
http://example.com/file.php
перенаправляет на http://example.com/file/
http://example.com/file
также необходимо перенаправить на http://example.com/file/
http://example.com/asdfsadf
иhttp://examplecom/file/asdfasdf
должен перейти на страницу 404
Вот магия htaccess, которую я собрал из постов здесь и в других местах.Кажется, это работает (в отличие от большинства заброшенных тем по теме, где всегда присутствует какое-то странное поведение).
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*[^.#?\ ]+\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(([^/]+/)*[^.]+)\.php http://example.com/$1 [R=301,L]
Как я уже сказал, насколько я могу судить, это прекрасно работает, даже с подкаталогами,Могут ли более знающие люди сказать мне, если я что-то упустил?Можно ли его улучшить или сократить?
Для чего это стоит, я также удаляю www:
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Кажется, работает нормально.Это включено после других частей.Это лучший заказ?
Спасибо всем, я надеюсь, мы сможем получить хороший, надежный ответ на этот вопрос, потому что есть много плохих.