Вопрос по .htaccess, url-rewriting, mod-rewrite – htaccess код для удаления расширения и добавления + принудительного слэша?

8

Я пытаюсь собрать код htaccess, которыйexample.com/filename.php вexample.com/filename/ (и принудительная косая черта) - я пробовал разные подходы, но каждый из них работал не совсем корректно: от 500 ошибок в подпапках до проблем с конечной косой чертой и т. д.

Пожалуйста помоги!

Вы на самом деле не упомянули подходы, которые вы пробовали - каков ваш текущий набор правил перезаписи (при условии, что вы используете mod_rewrite)? Если вы не используете mod_rewrite, что вы используете? Matthew Iselin
@Jono Alderson Итак, какой ответ здесь принят? nicorellius
RewriteBase / RewriteRule ^ () $ index.php [NC, L] Rewritecond% {REQUEST_URI}! (^ /?. * \ .. * $) [NC] RewriteRule ^ (. *) $ $ 1.php [NC] В настоящее время прекрасно работает, чтобы удалить расширение .php из файлов, независимо от глубины папки. Однако добавление / приводит к ошибке 404, и все попытки интеграции решения с принудительной косой чертой вызвали проблемы. Jono Alderson
Примите ответ, пожалуйста, этот вопрос также связан с другими вопросами. Mike Purcell

Ваш Ответ

6   ответов
0

Для пути вы можете добавить<base href="yourpath" /> на ваши php-страницы.

6

Это решение Gumbo отлично работает с файлами, но не работает с каталогами. Другими словами:

Заmysite.com/file1.php, это показываетmysite.com/file1/ это здорово. Тем не менее, это не работает хорошо для каталогов. Если я пытаюсь получить доступ к следующему каталогу (который содержит файл index.php внутри)mysite.com/dir1вместо того, чтобы показывать содержаниеhttp:/mysite.com/dir1/index.php и URL:mysite.com/dir1/, он возвращает 404.

Мое решение вокруг этого было:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]


RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ $1.php [L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

Другими словами, ничего не делать, если это каталог.

Надеюсь, поможет.

Другая проблема с исходным решением состоит в том, что CSS и изображения не загружаются, пока я не изменю путь к файлу CSS и к изображениям с абсолютным путем.

Есть ли другой способ решить эту проблему, вместо того, чтобы изменить все пути во всех файлах на сайте на абсолютные.

Большое спасибо.

Это не ответ на вопрос Джоно Олдерсона. Пожалуйста, откройте новый вопрос.
2
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]

Работает как шарм - спасибо за помощь, ребята.

Это решение? Не был выбран в качестве ответа ....
13

Попробуй это:

RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]

RewriteRule (.*)/$ $1.php [L]

Первое правило перенаправляет запросы/foo/bar.php внешне к/foo/bar/, И второе правило переписывает запросы/foo/bar/ внутренне для/foo/bar.php.

И, чтобы заставить косую черту, попробуйте это правило:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]
0

Вы можете попробовать отработать вопросВот, Хотя решение вопроса не является актуальным (пока ...), сам вопрос предоставляет набор правил переписывания, которые вы можете использовать на своем собственном сайте.

Если вам нужны символы в URL-адресах, вы можете просто использовать & quot;. * & Quot; вместо конкретного A-Za-z0-9, но если вы ищете возможную косую черту, вы можете использовать & quot; *? & quot; вместо. Это стандартная функция регулярных выражений, позволяющая избежать жадности ". *".

Хм. Это немного помогло, и теперь я использую: RewriteCond% {REQUEST_FILENAME}! -D RewriteCond% {REQUEST_FILENAME} \. Php -f RewriteRule ^ ([^ /] +) / $ $ 1.php # Принудительно завершающий слеш должен быть добавлен RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteCond% {REQUEST_URI}! (\. [a-zA-Z0-9] {1,5} | /) $ RewriteRule ( . *) $ / $ 1 / [R = 301, L] Это работает отлично (удаляет .php. И заставляет завершающий слеш), за исключением случаев, когда в подкаталоге выдается ошибка 404 :(
! (\. [a-zA-Z0-9] {1,5} | /) $, вероятно, должно быть! (([a-zA-Z0-9] /?) +) $. Если я не ошибаюсь, это будет соответствовать всем буквенно-цифровым символам, за которыми следует (необязательный) "/", и совпадать с этим один или несколько раз.
0

Попробуйте это, это работает на моем Apache, даже если вы удалите вручную последний слеш:

Options +FollowSymLinks -MultiViews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]
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]

Похожие вопросы