Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]CSP i cachowanie CSS
Forum PHP.pl > Forum > Przedszkole
Johnas
Witam, próbuję zrobić standardowo system zarządzania, który wszystkie problemy związane z SEO oraz optymalizacją będzie miał rozwiązane. Czyli wchodzi użytkownik, tworzy stronę, a system sam rozwiązuje jego problemy przez co użytkownik jest zwolniony z odpowiedzialności za wszelkie błędy. Chcę wprowadzić między innymi funkcję, która będzie automatycznie includowany javascript dodawać do footera, jeżeli ktoś stworzy szablon w którym javascript jest w headerze. Chcę aby strona osiągała najwyższe wyniki w Google Speed Page oraz w Light House (funkcja w google chrome po wciśnięciu CTRL+Shift+I). Mam problem z cachowaniem CSS oraz z CSP. O ile kiedyś rozwiązałem problem z pierwszym, a teraz mi się nie udaje to o tym drugim pierwszy raz słyszę. Używam hostingu na domena (kropka) pl i wydaję mi się że używają protokołu http w wersji 1.0 bo htaccess nie pozwala na cachowanie CSS. Błąd się nie poprawia. Mam certyfikat SSL i nie ma tam opcji włączenia http2. Ogólnie to chyba pozostaje zmienić hosting.
aras785
Użyj cloudflare
Johnas
jest to opcja, ale raczej nie pomaga to w pozycjonowaniu tongue.gif
vokiel
Cytat(Johnas @ 16.04.2022, 21:52:59 ) *
Mam problem z cachowaniem CSS oraz z CSP. O ile kiedyś rozwiązałem problem z pierwszym, a teraz mi się nie udaje to o tym drugim pierwszy raz słyszę.


Możesz nakreślić jaki ma związek CSP z cachowaniem CSS?


Cytat(Johnas @ 16.04.2022, 21:52:59 ) *
Używam hostingu na domena (kropka) pl i wydaję mi się że używają protokołu http w wersji 1.0 bo htaccess nie pozwala na cachowanie CSS. Błąd się nie poprawia.


Cache CSS nie ma związku z protokołem HTTP (no i raczej jest to HTTP/1.1). Może masz zablokowane niektóre dyrektywy jakich możesz użyć w swoim htaccess. A jaki błąd się pojawia?


Cytat(Johnas @ 16.04.2022, 21:52:59 ) *
Mam certyfikat SSL i nie ma tam opcji włączenia http2. Ogólnie to chyba pozostaje zmienić hosting.


Samo posiadanie certyfikatu nie daje z automatu http2, ale jest wymagane. Http2 trzeba włączyć w serwerze www i w danym vhoście (o ile nie zostanie ustawione domyślnie dla wszystkich). Jeśli na hostingu tego nie masz, nie możesz włączyć w panelu i po kontakcie z supportem też nie - to tak, najwyższy czas się przenieść do kogoś, kto ogarnia.
Johnas
Ja pytałem się o dwie rzeczy na raz. Może inaczej skonstruuje pytanie, mianowicie nie mam pojęcia jak zrobić dachowanie CSS przez co mi tego nie robi. Mógłby ktoś podesłać jakąś instrukcję?
vokiel
To tak, żeby cache miał sens, to nazwa zasobu musi być unikalna (w nazwie pliku hash z zawartości). Wtedy można cache ustawić na bardzo długi czas i jeśli zmieni się zawartość, hash się przeliczy i będzie nowy link.
Czyli de facto musisz tu mieć jakiś builder wpleciony. Krok po kroku to wygląda tak:
1. Budujesz całą stronę (html, js, css).
2. Dla assetów (js, css) wyliczasz ich hashe z zawartości pliku.
3. Zmieniasz nazwę (np z main.css, main.js na odpowiedniki z hashem w nazwie => main-a0a9af.css main-8a98asdf.js).
4. We wszystkich plikach HTML podmieniasz linki z main.css na main-a0a9af.css i main.js na main-8a98asdf.js

Cache plików HTML pownien być krótki, tak aby przeglądarka dość często pobierała samą stronę, natomiast assety można w takim przypadku wrzucać do cache nawet np na rok, albo w sumie też do nieskończoności ;-) Jeśli nastąpią zmiany w treści, wygeneruje się nowy hash, nowa nazwa pliku => przeglądarka pobierze nowe pliki.

CDN może serwować nagłówki z serwera źródła. Cache na poziomie serwera www można zrobić na kilka sposobów, w zależności od wersji, dostępnych modułów.
Przykłady dla Apache:

[APACHE] pobierz, plaintext
  1. <IfModule mod_headers.c>
  2. # Images - 1 year
  3. <filesMatch "\.(jpg|jpeg|png|gif|ico|svg)$">
  4. Header set Cache-Control "max-age=31536000, public"
  5. Header unset Set-Cookie
  6. </filesMatch>
  7.  
  8. # Fonts - 1 year
  9. <filesMatch "\.(ttf|otf|eot|woff|woff2)$">
  10. Header set Cache-Control "max-age=31536000, public"
  11. Header unset Set-Cookie
  12. </filesMatch>
  13.  
  14. # JS/CSS - 1 year
  15. <filesMatch "\.(css|js)$">
  16. Header set Cache-Control "max-age=31536000, public"
  17. Header unset Set-Cookie
  18. </filesMatch>
  19.  
  20. # Media files - 1 month
  21. <FilesMatch "\.(txt|pdf|flv|swf|mp3|mp4)$">
  22. Header set Cache-Control "max-age=2628000, public, must-revalidate"
  23. Header unset Set-Cookie
  24.  
  25. # Create the ETag to check resource hash every time
  26. FileETag MTime Size
  27. </FilesMatch>
  28.  
  29. # XML - 1 hour
  30. <FilesMatch "\.xml$">
  31. Header set Cache-Control "max-age=3600, public, must-revalidate, no-cache"
  32. # Create the ETag to check resource hash every time
  33. FileETag MTime Size
  34. </FilesMatch>
  35.  
  36. # Short, 1 min cache for html files, forcing re-validate with ETag
  37. <FilesMatch ".(htm|html)$">
  38. Header set Cache-Control "max-age=60, public, must-revalidate, no-cache"
  39. # Create the ETag to check resource hash every time
  40. FileETag MTime Size
  41. </FilesMatch>
  42.  
  43. # PHP and JSON - disabled
  44. <FilesMatch "\.(php|json)$">
  45. Header set Cache-Control: "max-age=0, no-store, no-cache"
  46. </FilesMatch>
  47.  
  48. # Make sure old browser won't get compressed files
  49. <FilesMatch ".(js|css|xml|svg|json|gz|html|htm)$">
  50. Header append Vary Accept-Encoding
  51. </FilesMatch>
  52. </IfModule>
[APACHE] pobierz, plaintext


[APACHE] pobierz, plaintext
  1. <IfModule mod_expires.c>
  2. # Set basic Expires header as a fallback
  3. # If there is a Cache-Control header with the "max-age" or "s-maxage" directive in the response,
  4. # the Expires header is ignored.
  5. ExpiresActive on
  6.  
  7. # By default cache all for 1 minute only
  8. # (so nothing will be cached for too long)
  9. ExpiresDefault "access plus 60 seconds"
  10.  
  11. # Images
  12. ExpiresByType image/gif "access plus 1 year"
  13. ExpiresByType image/png "access plus 1 year"
  14. ExpiresByType image/jpg "access plus 1 year"
  15. ExpiresByType image/jpeg "access plus 1 year"
  16. ExpiresByType image/pipeg "access plus 1 year"
  17. ExpiresByType image/svg+xml "access plus 1 year"
  18.  
  19. # Icons
  20. ExpiresByType image/ico "access plus 1 year"
  21. ExpiresByType image/icon "access plus 1 year"
  22. ExpiresByType text/ico "access plus 1 year"
  23. ExpiresByType image/x-ico "access plus 1 year"
  24. ExpiresByType image/x-icon "access plus 1 year"
  25. ExpiresByType application/ico "access plus 1 year"
  26. ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
  27.  
  28. # Audio
  29. ExpiresByType audio/ogg "access plus 1 month"
  30. ExpiresByType audio/basic "access plus 1 month"
  31. ExpiresByType audio/mid "access plus 1 month"
  32. ExpiresByType audio/midi "access plus 1 month"
  33. ExpiresByType audio/mpeg "access plus 1 month"
  34. ExpiresByType audio/x-aiff "access plus 1 month"
  35. ExpiresByType audio/x-mpegurl "access plus 1 month"
  36. ExpiresByType audio/x-pn-realaudio "access plus 1 month"
  37. ExpiresByType audio/x-wav "access plus 1 month"
  38.  
  39. # Video
  40. ExpiresByType video/ogg "access plus 1 month"
  41. ExpiresByType video/mp4 "access plus 1 month"
  42. ExpiresByType video/webm "access plus 1 month"
  43. ExpiresByType video/x-msvideo "access plus 1 month"
  44. ExpiresByType video/mpeg "access plus 1 month"
  45. ExpiresByType video/quicktime "access plus 1 month"
  46. ExpiresByType video/x-la-asf "access plus 1 month"
  47. ExpiresByType video/x-ms-asf "access plus 1 month"
  48. ExpiresByType x-world/x-vrml "access plus 1 month"
  49.  
  50. # Fonts
  51. ExpiresByType font/truetype "access plus 1 year"
  52. ExpiresByType font/opentype "access plus 1 year"
  53. ExpiresByType application/x-font-ttf "access plus 1 year"
  54. ExpiresByType application/x-font-woff "access plus 1 year"
  55. ExpiresByType application/font-woff "access plus 1 year"
  56. ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
  57.  
  58. # Scripts and styles
  59. ExpiresByType text/css "access plus 1 year"
  60. ExpiresByType text/javascript "access plus 1 year"
  61. ExpiresByType text/x-javascript "access plus 1 year"
  62. ExpiresByType application/javascript "access plus 1 year"
  63. ExpiresByType application/x-javascript "access plus 1 year"
  64.  
  65. # Data
  66. ExpiresByType application/pdf "access plus 1 month"
  67. ExpiresByType image/vnd.wap.wbmp "access plus 1 month"
  68. ExpiresByType application/vnd.wap.wbxml "access plus 1 month"
  69. ExpiresByType application/smil "access plus 1 month"
  70.  
  71. # Text
  72. ExpiresByType text/html "access plus 1 minute"
  73. ExpiresByType text/plain "access plus 1 minute"
  74. ExpiresByType text/xml "access plus 1 minute"
  75. ExpiresByType application/xml "access plus 1 minute"
  76.  
  77. # RSS
  78. ExpiresByType application/rss+xml "access plus 1 hour"
  79. ExpiresByType application/atom+xml "access plus 1 hour"
  80. ExpiresByType text/x-component "access plus 1 hour"
  81.  
  82. # Live data
  83. ExpiresByType application/json "access plus 0 seconds"
  84. ExpiresByType application/ld+json "access plus 0 seconds"
  85.  
  86. # Manifest
  87. ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
  88. ExpiresByType text/cache-manifest "access plus 0 seconds"
  89.  
  90. # PHP - diable to be cached unless they explicitly send cache headers themselves.
  91. <FilesMatch \.php$>
  92. ExpiresActive Off
  93. </FilesMatch>
  94.  
  95. </IfModule>
[APACHE] pobierz, plaintext


[APACHE] pobierz, plaintext
  1. <IfModule mod_deflate.c>
  2. # Compress HTML, CSS, JavaScript, Text, XML and fonts
  3. AddOutputFilterByType DEFLATE application/javascript
  4. AddOutputFilterByType DEFLATE application/rss+xml
  5. AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  6. AddOutputFilterByType DEFLATE application/x-font
  7. AddOutputFilterByType DEFLATE application/x-font-opentype
  8. AddOutputFilterByType DEFLATE application/x-font-otf
  9. AddOutputFilterByType DEFLATE application/x-font-truetype
  10. AddOutputFilterByType DEFLATE application/x-font-ttf
  11. AddOutputFilterByType DEFLATE application/x-javascript
  12. AddOutputFilterByType DEFLATE application/xhtml+xml
  13. AddOutputFilterByType DEFLATE application/xml
  14. AddOutputFilterByType DEFLATE font/opentype
  15. AddOutputFilterByType DEFLATE font/otf
  16. AddOutputFilterByType DEFLATE font/ttf
  17. AddOutputFilterByType DEFLATE image/svg+xml
  18. AddOutputFilterByType DEFLATE image/x-icon
  19. AddOutputFilterByType DEFLATE text/css
  20. AddOutputFilterByType DEFLATE text/html
  21. AddOutputFilterByType DEFLATE text/javascript
  22. AddOutputFilterByType DEFLATE text/plain
  23. AddOutputFilterByType DEFLATE text/xml
  24. </IfModule>
[APACHE] pobierz, plaintext
Johnas
Pomyślałem o generowaniu przez PHP plików CSS z hashowanym rozmiarem pliku tylko nie wiem jak optymalnie można byłoby to zrobić sad.gif
vokiel
Rozmiar to nie jest dobry wyznacznik. Możesz dodać 100 znaków i 100 innych usunąć i rozmiar zostanie ten sam, a zawartość się będzie różnić. Hash z zawartości jest najpewniejszy.
Johnas
Hash całej zawartości? I pytanie, generować nowe pliki CSS przez PHP czy da się to zrobić na poziomie revite rule w htaccess
vokiel
Zwykle CSSy się buduje z jakiś SASS/SCS, buildery oparte są o JS, mają zwykle taki ficzer wbudowany albo łatwy do dołączenia.

Jeśli nie korzystasz z czegoś takiego, to tak czy inaczej w PHP jest to łatwe do osiągnięcia, bo przecież są gotowe funkcje jak https://www.php.net/manual/en/function.hash-file.php czy też https://www.php.net/manual/en/function.sha1-file.php

Cytat
I pytanie, generować nowe pliki CSS przez PHP czy da się to zrobić na poziomie revite rule w htaccess


Generalnie to odwrotnie - masz zmienione pliki CSS, zmieniasz ich nazwę i podmieniasz ją w plikach HTML.
Johnas
a jakbym nie zmieniał nazwy plików tylko dodawał do nazwy css hash - przykład: nazwa.css?v=hash to nie będzie to w taki sam sposób działać ?
php11
Cytat(Johnas @ 24.04.2022, 18:22:32 ) *
dodawał do nazwy css hash - przykład: nazwa.css?v=hash


Ja w ten sposób dodaję na końcu datę zmiany.
Z hashem będzie automat ;-)
vokiel
Cytat(Johnas @ 24.04.2022, 18:22:32 ) *
a jakbym nie zmieniał nazwy plików tylko dodawał do nazwy css hash - przykład: nazwa.css?v=hash to nie będzie to w taki sam sposób działać ?


Będzie.
Johnas
Cytat(vokiel @ 20.04.2022, 21:20:02 ) *
To tak, żeby cache miał sens, to nazwa zasobu musi być unikalna (w nazwie pliku hash z zawartości). Wtedy można cache ustawić na bardzo długi czas i jeśli zmieni się zawartość, hash się przeliczy i będzie nowy link.
Czyli de facto musisz tu mieć jakiś builder wpleciony. Krok po kroku to wygląda tak:
1. Budujesz całą stronę (html, js, css).
2. Dla assetów (js, css) wyliczasz ich hashe z zawartości pliku.
3. Zmieniasz nazwę (np z main.css, main.js na odpowiedniki z hashem w nazwie => main-a0a9af.css main-8a98asdf.js).
4. We wszystkich plikach HTML podmieniasz linki z main.css na main-a0a9af.css i main.js na main-8a98asdf.js

Cache plików HTML pownien być krótki, tak aby przeglądarka dość często pobierała samą stronę, natomiast assety można w takim przypadku wrzucać do cache nawet np na rok, albo w sumie też do nieskończoności ;-) Jeśli nastąpią zmiany w treści, wygeneruje się nowy hash, nowa nazwa pliku => przeglądarka pobierze nowe pliki.

CDN może serwować nagłówki z serwera źródła. Cache na poziomie serwera www można zrobić na kilka sposobów, w zależności od wersji, dostępnych modułów.
Przykłady dla Apache:

[APACHE] pobierz, plaintext
  1. <IfModule mod_headers.c>
  2. # Images - 1 year
  3. <filesMatch "\.(jpg|jpeg|png|gif|ico|svg)$">
  4. Header set Cache-Control "max-age=31536000, public"
  5. Header unset Set-Cookie
  6. </filesMatch>
  7.  
  8. # Fonts - 1 year
  9. <filesMatch "\.(ttf|otf|eot|woff|woff2)$">
  10. Header set Cache-Control "max-age=31536000, public"
  11. Header unset Set-Cookie
  12. </filesMatch>
  13.  
  14. # JS/CSS - 1 year
  15. <filesMatch "\.(css|js)$">
  16. Header set Cache-Control "max-age=31536000, public"
  17. Header unset Set-Cookie
  18. </filesMatch>
  19.  
  20. # Media files - 1 month
  21. <FilesMatch "\.(txt|pdf|flv|swf|mp3|mp4)$">
  22. Header set Cache-Control "max-age=2628000, public, must-revalidate"
  23. Header unset Set-Cookie
  24.  
  25. # Create the ETag to check resource hash every time
  26. FileETag MTime Size
  27. </FilesMatch>
  28.  
  29. # XML - 1 hour
  30. <FilesMatch "\.xml$">
  31. Header set Cache-Control "max-age=3600, public, must-revalidate, no-cache"
  32. # Create the ETag to check resource hash every time
  33. FileETag MTime Size
  34. </FilesMatch>
  35.  
  36. # Short, 1 min cache for html files, forcing re-validate with ETag
  37. <FilesMatch ".(htm|html)$">
  38. Header set Cache-Control "max-age=60, public, must-revalidate, no-cache"
  39. # Create the ETag to check resource hash every time
  40. FileETag MTime Size
  41. </FilesMatch>
  42.  
  43. # PHP and JSON - disabled
  44. <FilesMatch "\.(php|json)$">
  45. Header set Cache-Control: "max-age=0, no-store, no-cache"
  46. </FilesMatch>
  47.  
  48. # Make sure old browser won't get compressed files
  49. <FilesMatch ".(js|css|xml|svg|json|gz|html|htm)$">
  50. Header append Vary Accept-Encoding
  51. </FilesMatch>
  52. </IfModule>
[APACHE] pobierz, plaintext


[APACHE] pobierz, plaintext
  1. <IfModule mod_expires.c>
  2. # Set basic Expires header as a fallback
  3. # If there is a Cache-Control header with the "max-age" or "s-maxage" directive in the response,
  4. # the Expires header is ignored.
  5. ExpiresActive on
  6.  
  7. # By default cache all for 1 minute only
  8. # (so nothing will be cached for too long)
  9. ExpiresDefault "access plus 60 seconds"
  10.  
  11. # Images
  12. ExpiresByType image/gif "access plus 1 year"
  13. ExpiresByType image/png "access plus 1 year"
  14. ExpiresByType image/jpg "access plus 1 year"
  15. ExpiresByType image/jpeg "access plus 1 year"
  16. ExpiresByType image/pipeg "access plus 1 year"
  17. ExpiresByType image/svg+xml "access plus 1 year"
  18.  
  19. # Icons
  20. ExpiresByType image/ico "access plus 1 year"
  21. ExpiresByType image/icon "access plus 1 year"
  22. ExpiresByType text/ico "access plus 1 year"
  23. ExpiresByType image/x-ico "access plus 1 year"
  24. ExpiresByType image/x-icon "access plus 1 year"
  25. ExpiresByType application/ico "access plus 1 year"
  26. ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
  27.  
  28. # Audio
  29. ExpiresByType audio/ogg "access plus 1 month"
  30. ExpiresByType audio/basic "access plus 1 month"
  31. ExpiresByType audio/mid "access plus 1 month"
  32. ExpiresByType audio/midi "access plus 1 month"
  33. ExpiresByType audio/mpeg "access plus 1 month"
  34. ExpiresByType audio/x-aiff "access plus 1 month"
  35. ExpiresByType audio/x-mpegurl "access plus 1 month"
  36. ExpiresByType audio/x-pn-realaudio "access plus 1 month"
  37. ExpiresByType audio/x-wav "access plus 1 month"
  38.  
  39. # Video
  40. ExpiresByType video/ogg "access plus 1 month"
  41. ExpiresByType video/mp4 "access plus 1 month"
  42. ExpiresByType video/webm "access plus 1 month"
  43. ExpiresByType video/x-msvideo "access plus 1 month"
  44. ExpiresByType video/mpeg "access plus 1 month"
  45. ExpiresByType video/quicktime "access plus 1 month"
  46. ExpiresByType video/x-la-asf "access plus 1 month"
  47. ExpiresByType video/x-ms-asf "access plus 1 month"
  48. ExpiresByType x-world/x-vrml "access plus 1 month"
  49.  
  50. # Fonts
  51. ExpiresByType font/truetype "access plus 1 year"
  52. ExpiresByType font/opentype "access plus 1 year"
  53. ExpiresByType application/x-font-ttf "access plus 1 year"
  54. ExpiresByType application/x-font-woff "access plus 1 year"
  55. ExpiresByType application/font-woff "access plus 1 year"
  56. ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
  57.  
  58. # Scripts and styles
  59. ExpiresByType text/css "access plus 1 year"
  60. ExpiresByType text/javascript "access plus 1 year"
  61. ExpiresByType text/x-javascript "access plus 1 year"
  62. ExpiresByType application/javascript "access plus 1 year"
  63. ExpiresByType application/x-javascript "access plus 1 year"
  64.  
  65. # Data
  66. ExpiresByType application/pdf "access plus 1 month"
  67. ExpiresByType image/vnd.wap.wbmp "access plus 1 month"
  68. ExpiresByType application/vnd.wap.wbxml "access plus 1 month"
  69. ExpiresByType application/smil "access plus 1 month"
  70.  
  71. # Text
  72. ExpiresByType text/html "access plus 1 minute"
  73. ExpiresByType text/plain "access plus 1 minute"
  74. ExpiresByType text/xml "access plus 1 minute"
  75. ExpiresByType application/xml "access plus 1 minute"
  76.  
  77. # RSS
  78. ExpiresByType application/rss+xml "access plus 1 hour"
  79. ExpiresByType application/atom+xml "access plus 1 hour"
  80. ExpiresByType text/x-component "access plus 1 hour"
  81.  
  82. # Live data
  83. ExpiresByType application/json "access plus 0 seconds"
  84. ExpiresByType application/ld+json "access plus 0 seconds"
  85.  
  86. # Manifest
  87. ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
  88. ExpiresByType text/cache-manifest "access plus 0 seconds"
  89.  
  90. # PHP - diable to be cached unless they explicitly send cache headers themselves.
  91. <FilesMatch \.php$>
  92. ExpiresActive Off
  93. </FilesMatch>
  94.  
  95. </IfModule>
[APACHE] pobierz, plaintext


[APACHE] pobierz, plaintext
  1. <IfModule mod_deflate.c>
  2. # Compress HTML, CSS, JavaScript, Text, XML and fonts
  3. AddOutputFilterByType DEFLATE application/javascript
  4. AddOutputFilterByType DEFLATE application/rss+xml
  5. AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  6. AddOutputFilterByType DEFLATE application/x-font
  7. AddOutputFilterByType DEFLATE application/x-font-opentype
  8. AddOutputFilterByType DEFLATE application/x-font-otf
  9. AddOutputFilterByType DEFLATE application/x-font-truetype
  10. AddOutputFilterByType DEFLATE application/x-font-ttf
  11. AddOutputFilterByType DEFLATE application/x-javascript
  12. AddOutputFilterByType DEFLATE application/xhtml+xml
  13. AddOutputFilterByType DEFLATE application/xml
  14. AddOutputFilterByType DEFLATE font/opentype
  15. AddOutputFilterByType DEFLATE font/otf
  16. AddOutputFilterByType DEFLATE font/ttf
  17. AddOutputFilterByType DEFLATE image/svg+xml
  18. AddOutputFilterByType DEFLATE image/x-icon
  19. AddOutputFilterByType DEFLATE text/css
  20. AddOutputFilterByType DEFLATE text/html
  21. AddOutputFilterByType DEFLATE text/javascript
  22. AddOutputFilterByType DEFLATE text/plain
  23. AddOutputFilterByType DEFLATE text/xml
  24. </IfModule>
[APACHE] pobierz, plaintext


Ten Twój kod działa za dobrze... chciałbym wyłączyć z cachowania katalog admin. Powiesz mi jak to zrobić ?
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.