Переписать / перенаправить вопрос относительно расширений и слешей - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь создать красивые, дружественные для SEO URL-адреса на своих страницах PHP, но я постоянно сталкиваюсь с 500 внутренними ошибками, поэтому застрял.Вот краткое изложение:

Структура папки

  /    
    /index.php
       /about      <--Folder
       /about/index.php   
       /about/our-people.php   <--a subpage
       /services   <--Another folder
       /services/index.php
       /services/service1.php  <--another subpage

Я хочу, чтобы URL не имел расширения .php, но содержал косую черту вместо.Например, страница "Наши люди" будет www.example.com / about / our-people /

www.example.com / about / our-people.php или www.example.com / about / our-people (без косой черты) перейдет на www.example.com / about / our-people /

Я знаю, что этот вопрос, вероятно, задавалсядо смерти, но я пробовал множество примеров как из Stackoverflow, так и из других мест.Апач для меня как вуду, иногда он делает магические вещи, а иногда просто не работает.Вот код, который у меня есть:

#add www to non-www
RewriteCond %{HTTP_HOST} ^example.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301] 

#Remove .PHP
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L]

#Add Slash
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301]

1 Ответ

0 голосов
/ 23 сентября 2011

Я бы подошел к этому немного по-другому.Если вы не очень хорошо знакомы с Apache, я рекомендую вам взять на себя как можно больше ответственности за Apache и настроить скрипт диспетчера, который решает, какой файл PHP выполняется, проверяя запрошенный URI.

Идея довольно проста: «перенаправить» каждый запрос на один файл PHP, а затем использовать этот файл, чтобы определить, какой файл вы действительно хотите выполнить.

Например,

http://domain.com/ => index.php? Request =

http://domain.com/moo/ => index.php? Request = moo /

http://domain.com/moo/1/2/3/4/ => index.php? Request = moo / 1/2/3/4 /

Et cetera

Пример:

(Предполагается, что у вас есть файлы .htaccess и index.php в корневом веб-каталоге)

.htaccess:

# "Hi Apache, we're going to be rewriting requests now!"
# (You can do all this in Apache configuration files too, of course)
RewriteEngine On
RewriteBase /

# Ignore *.gif, *.jpg. *.png, *.js, and *.css requests, so those files
# will continue to be served as per usual
RewriteRule \.(gif|jpg|png|js|css)$ - [L]

# For the rest, convert the URI into $_GET[ 'request' ]
RewriteRule ^(.*)$ index.php?request=$1 [QSA] [L]

index.php:

<?php

print "<pre>Request: " . $_GET[ 'request' ] . "\n";

// Dispatcher should be smarter than this -- otherwise you
// will have serious security concerns

$filename = $_GET[ 'request' ] . '.php';

if( file_exists( $filename ) === TRUE )
    require( $filename );
else
    print "Not found: $filename";
...