Переадресация косой черты URL без расширения
Я тестировал приведенный ниже код на нескольких доменах, размещенных на Dreamhost, и он работает - за исключением новых доменов, которые я добавил в течение прошлого года.
RewriteEngine on
#unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]
#redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.*)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.*)\.php$ $1 [R=301,L]
#resolve .php file for extensionless php urls
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
пример, который работает:
http://ryanvanetten.com/resources/lame/ и http://ryanvanetten.com/resources/lame.php и перенаправляют на http://ryanvanetten.com/resources/lame, а фактический файл - lame.php
сломанный пример:
http://airve.com/test/file правильно обслуживает file.php, но перенаправления http://airve.com/test/file/ и http://airve.com/test/file.php не работают. Попробуйте их, и вы увидите, что они, кажется, выплевывают внутренний абсолютный путь. То же самое произошло, когда я попробовал каждое из перенаправлений независимо и когда я попробовал базовое перенаправление ниже.
Redirect 301 /test/file/ /test/file
В.htaccess больше ничего нет. Есть идеи по поводу проблемы?
1 ответ
Вы перенаправляете на $1
в обоих случаях, и у вас нет директивы RewriteBase, чтобы сообщить Apache, где получить такой относительный путь.
Попробуйте добавить корневой слеш перед $1, чтобы привязать его к корню вашего веб-сервера, например:
RewriteRule ^(.*)$ /$1.php [L]