Как сделать URL-адрес приложения Pretty (SEF) с помощью htaccess

Это URL моего приложения

http://mydomain.com/index.php
http://mydomain.com/video.php?id=29
http://mydomain.com/news.php?id=33
http://mydomain.com/photos.php?albumid=10
http://mydomain.com/archive.php
http://mydomain.com/album.php
http://mydomain.com/contact.php

я хочу, чтобы мой URL выглядел чистым с помощью htaccess, как

http://mydomain.com/video/id/29
http://mydomain.com/news/id/33
http://mydomain.com/photos/albumid/10
http://mydomain.com/archive
http://mydomain.com/album
http://mydomain.com/contact

проблема в том, что старое приложение уже использует много кодов htaccess в корневом каталоге. Вот код, который уже существует в htaccess.

php_value post_max_size 100M
php_value upload_max_filesize 100M
php_value memory_limit 100M

#
# Apache/PHP/osTube settings:
#

# Don't show directory listings for URLs which map to a directory.
#Options -Indexes

# Follow symbolic links in this directory.
#Options +FollowSymLinks

# Set the default handler.
#DirectoryIndex index.php

# Override some PHP settings. 

# PHP 4, Apache 1.
<IfModule mod_php4.c>
  php_value error_reporting 6135
</IfModule>

# PHP 4, Apache 2.
<IfModule sapi_apache2.c>
  php_value error_reporting 6135
</IfModule>

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
  php_value error_reporting 6135
</IfModule>

# Deny access to certain files
<Files "convert.php">
Order Deny,Allow
Deny from All
</Files>

# Various rewrite rules.
<IfModule mod_rewrite.c>
  RewriteEngine on

  # If your site can be accessed both with and without the prefix www. you
  # can use one of the following settings to force user to use only one option:
  #
  # If you want the site to be accessed WITH the www. only, adapt and
  # uncomment the following:
  # RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
  # RewriteRule .* http://www.example.com/ [L,R=301]
  #
  # If you want the site to be accessed only WITHOUT the www. prefix, adapt
  # and uncomment the following:
  # RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
  # RewriteRule .* http://example.com/ [L,R=301]

  # Modify the RewriteBase if you are using osTube in a subdirectory and
  # the rewrite rules are not working properly.
  # RewriteBase /ostube

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Home(.*)$ index.php$1 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(video|audio|document|photo)/([0-9]+)(/[^/]+)?/?(.*)$ mediadetails.php?mid=$2&$4 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Video(.*)$ media.php?type=video$1 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Audio(.*)$ media.php?type=audio$1 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Document(.*)$ media.php?type=document$1 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Photo(.*)$ media.php?type=photo$1 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Tags(.*)$ tags.php$1 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Community(.*)$ community.php$1 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^weblog/([0-9]+)(/[^/]+)?/?(.*)$ blog.php?action=post&pid=$1&$3 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Weblog(.*)$ blog.php$1 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Channel/(video|audio|document|photo)/([0-9]+)(/[^/]+)?/?(.*)$ media.php?type=$1&chid=$2$4 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^Tag/([0-9]+)/?(.*)$ search_result.php?tid=$1&$2 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^User/([^/]+)/?(.*)$ userprofile.php?uname=$1$2 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^WebTV/([^/]+)/([0-9]+)(.*)$ webtv.php?mode=$1&id=$2$3 [L,QSA,NC]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^WebTV(.*)$ webtv.php$1 [L,QSA,NC]

  RewriteRule ^flvplayer.swf vimp.swf [L,QSA,NC]
  RewriteCond %{QUERY_STRING} ^mediaid=(\d+)&action=getmediainfo$
  RewriteRule ^$ flashcomm.php?mediaid=%1&action=getmediainfo [L,NC]
  RewriteCond %{QUERY_STRING} ^action=getmediainfo&mediaid=(\d+)$
  RewriteRule ^$ flashcomm.php?mediaid=%1&action=getmediainfo [L,NC]

  #RewriteCond %{REQUEST_FILENAME} !-f
  #RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^sitemap.xml$ sitemap.php [L,QSA,NC]
</IfModule>

какой код я должен использовать для Rewrite_rule, а также я был бы признателен, если бы кто-то мог направить меня к учебнику, где я смогу понять htaccess, а также регулярные выражения.

Кроме того, я хотел бы отключить просмотр файлов параметров индекса или что-то, что я точно не помню.

благодарю вас..

1 ответ

Решение

Попробуйте следующее

#Turn off option indexes
Options -Indexes

RewriteCond %{REQUEST_URI} "/js/" [OR]
RewriteCond %{REQUEST_URI} "/images/" [OR]
RewriteCond %{REQUEST_URI} "/css/"
RewriteRule (.*) $1 [L]

#Rewrite Rules
RewriteRule ^video/(.*) /video.php?id=$1 [L] //This gives you domain.com/video/33
RewriteRule ^video/id/(.*) /video.php?id=$1 [L] //This gives you domain.com/video/id/33

Первый раздел: ^video/(.*) это то, что вы хотите, чтобы ваш URL был похож. (.*) является заполнителем для переменной. Второй раздел /video.php?id=$1 фактический URL, который будет переписан. $1 переменная, которая будет заменена в первом разделе.

Правила RewriteCond говорят нам игнорировать эти папки, а не переписывать их.

Надеюсь это поможет. У Sitepoint есть хорошая статья для начинающих по использованию mod_rewrite - http://articles.sitepoint.com/article/guide-url-rewriting

Другие вопросы по тегам