Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTAccess] Bez folderu szablonu
Forum PHP.pl > Forum > PHP
rangoo
Witam,

Próbuję napisać kod który:
przy /ab przechodzi do index.php?page=ab
przy /ab/cd przechodzi do index.php?page=ab&action=cd
przy plikach JS/HTML/CSS itp. ładuje te pliki.

lub - jeśli tamto odpada - ładuje pliki z _theme, a inne do index.php.

Napisałem coś takiego:
Kod
RewriteEngine on
RewriteBase /

RewriteRule \.(js|ico|gif|jpg|png|css)$ -
RewriteRule ^([^/]*?)$ index.php?page=$1 [QSA]
RewriteRule ^([^/]*?)/([^/]*?)$ index.php?page=$1&action=$2 [QSA,L]

Ale nie działa ;/

Z góry dziękuję za pomoc
gac3k
Napisz to od strony PHP, a .htaccess użyj tylko do przekierowania do index.php. Może wydaje Ci się teraz że to głupia rada ^^ ale wież mi że to znaczni ułatwi sprawę nawet jeśli będziesz musiał trochę zmodyfikować kod.
rangoo
W sensie że index.php przekierowuje albo do pliku grafiki albo do kontrolera?
gac3k
tzn. w htaccess zrób sobie np. tak

  1.  
  2. RewriteEngine On
  3.  
  4. # Tutaj ustawiasz żeby wszystkie istniejące pliki (np. grafiki, style) wyświetlane były bezpośrednio
  5. RewriteCond %{REQUEST_FILENAME} !-f
  6. RewriteCond %{REQUEST_FILENAME} !-d
  7.  
  8. # Cała reszta żądań leci do index.php
  9. RewriteRule ^(.+)$ index.php/$0 [QSA]


i wtedy w index.php rozbijasz sobie to co masz w zmiennej $_SERVER['PATH_INFO'] i z tego interpretujesz to co chcesz wykonać.
rangoo
Zrealizowałem to tak:

PHP:
  1. public function Load($module, $action, $parameters = array())
  2. {
  3. if(is_dir($module))
  4. {
  5. $forbidden = array('php', 'tpl');
  6. if(file_exists($module.'/'.$action) && !is_dir($module.'/'.$action) && !in_array(strtolower(end(explode('.', $action))), $forbidden))
  7. {
  8. echo implode('', file($module.'/'.$action));
  9. }
  10. else
  11. {
  12. @Header('HTTP/1.0 404 Not Found');
  13. exit("<h1>404 Not Found</h1>\nThe page that you have requested could not be found.");
  14. }
  15. }
  16. else
  17. {
  18. // Ładowanie kontrolera
  19. }
  20. }

HTAccess
Kod
RewriteEngine on
RewriteBase /

RewriteRule ^([^/]*?)$ index.php?page=$1 [QSA]
RewriteRule ^([^/]*?)/([^/]*?)$ index.php?page=$1&action=$2 [QSA,L]

Nie wiem jak sprawa szybkości tego rozwiązania, ale spełnia raczej swoje zadanie wink.gif

@EDIT
Jednak nie spełnia...
Wszystkie pliki mają content-type: text/html (łącznie z obrazkami). Jak to poprawić?

@EDIT2
Poprawiłem.
Napisałem funkcję do MIME (wspomogłem się zasobami jakiegoś bloga):
  1. function mimetype($file)
  2. {
  3. if (defined(FILEINFO_MIME)&&($t=new finfo(FILEINFO_MIME)))
  4. {
  5. return $t->file($file);
  6. }
  7. elseif(function_exists('mime_content_type'))
  8. {
  9. return @mime_content_type($file);
  10. }
  11. else
  12. {
  13. $mime_types=array(
  14. 'txt' => 'text/plain',
  15. 'htm' => 'text/html',
  16. 'html' => 'text/html',
  17. 'php' => 'text/html',
  18. 'css' => 'text/css',
  19. 'js' => 'application/javascript',
  20. 'json' => 'application/json',
  21. 'xml' => 'application/xml',
  22. 'swf' => 'application/x-shockwave-flash',
  23. 'flv' => 'video/x-flv',
  24. // images
  25. 'png' => 'image/png',
  26. 'jpe' => 'image/jpeg',
  27. 'jpeg' => 'image/jpeg',
  28. 'jpg' => 'image/jpeg',
  29. 'gif' => 'image/gif',
  30. 'bmp' => 'image/bmp',
  31. 'ico' => 'image/vnd.microsoft.icon',
  32. 'tiff' => 'image/tiff',
  33. 'tif' => 'image/tiff',
  34. 'svg' => 'image/svg+xml',
  35. 'svgz' => 'image/svg+xml',
  36. // archives
  37. 'zip' => 'application/zip',
  38. 'rar' => 'application/x-rar-compressed',
  39. 'exe' => 'application/x-msdownload',
  40. 'msi' => 'application/x-msdownload',
  41. 'cab' => 'application/vnd.ms-cab-compressed',
  42. // audio/video
  43. 'mp3' => 'audio/mpeg',
  44. 'qt' => 'video/quicktime',
  45. 'mov' => 'video/quicktime',
  46. // adobe
  47. 'pdf' => 'application/pdf',
  48. 'psd' => 'image/vnd.adobe.photoshop',
  49. 'ai' => 'application/postscript',
  50. 'eps' => 'application/postscript',
  51. 'ps' => 'application/postscript',
  52. // ms office
  53. 'doc' => 'application/msword',
  54. 'rtf' => 'application/rtf',
  55. 'xls' => 'application/vnd.ms-excel',
  56. 'ppt' => 'application/vnd.ms-powerpoint',
  57. // open office
  58. 'odt' => 'application/vnd.oasis.opendocument.text',
  59. 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
  60. );
  61. $ext = strtolower(end(explode('.',$file)));
  62.  
  63. if (array_key_exists($ext,$mime_types))
  64. {
  65. return $mime_types[$ext];
  66. }
  67. else
  68. {
  69. return 'application/octet-stream';
  70. }
  71. }
  72. }

A w metodzie Load klasy poprawiłem
  1. echo implode('', file($module.'/'.$action));

na
  1. @Header('Content-type: '.mimetype($module.'/'.$action));
  2. echo implode('', file($module.'/'.$action));
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.