Autor Zpráva
davchy
Profil
Zdravím, mám htaccess viz níže a řeším problém, že pokud zadám nejaky.web/virtualni-adresar/ , tak poslední řádek v htaccess (business_detail.php?permalink=$1) se provede, ale když zadám tu stejnou adresu bez koncového lomítka, tak dostanu 404.
Zkoušel jsem použít různá zdejší řešení na přidání koncového lomítka ke všem URL, ale to pak přestanou pracovat jiné řádky (třeba řádek s /products/ a jiné).

Říkal jsem si, že řešením by bylo, kdyby se případné chybějící koncové lomítko doplnilo jen v tom případě, pokud by šlo o virtuální adresář první úrovně, to znamená nejaky.web/virtualni-adresar a pokud by to bylo nejaky.web/virtualni-adresar/ nebo nejaky.web/virtualni-adresar/dalsi-adresar , tak by se nedoplnilo. To znamená, že doplnění by bylo jen v případě, kdyby za nejaky.web bylo jen jedno lomitko a nejaky retezec bez výskytu lomítka.

Pokud to takto lze, jak by pak byl zápis?

Děkuji.

RewriteEngine on

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)/about_us/(.*)/(.*)$ business_page.php?permalink=$1&id_pages=$2
RewriteRule ^(.*)/jobs/(.*)/(.*)$ business_jobs.php?permalink=$1&id_jobs=$2
RewriteRule ^cat/(.*)/(.*)$ about-us.php?id_categories=$1
RewriteRule ^confirm/(.*)/(.*)$ confirm.php?businesshash=$1&id_business=$2
RewriteRule ^(.*)/sitemap.xml$ business_sitemap.php?permalink=$1
RewriteRule ^(.*)/image_gallery$ business_image_gallery.php?permalink=$1 [L]
RewriteRule ^(.*)/product_catalogue$ business_product_catalogue.php?permalink=$1
RewriteRule ^(.*)/products/(.*)/(.*)$ business_products.php?permalink=$1&id_product_categories=$2
RewriteRule ^(.*)/product_detail/(.*)/(.*)$ business_product_detail.php?permalink=$1&id_product=$2

RewriteRule ^forgotten_password$ forgotten_password.php
RewriteRule ^about-us$ about-us.php
RewriteRule ^contact-us$ contact_us.php
RewriteRule ^instagram$ instagram.php
RewriteRule ^register$ register.php
RewriteRule ^thank-you$ thank-you.php
RewriteRule ^admin/$ admin/index.php
RewriteRule ^admin/logout$ admin/logout.php

RewriteRule ^(.*)/contact_us$ business_contact.php?permalink=$1
RewriteRule ^(.*)/$  business_detail.php?permalink=$1 [L]
Kajman
Profil
Pro přesměrování bych zkusil na začátek dát
RewriteRule ^([^./]+)$ https://%{HTTP_HOST}/$1/ [L,NE,R=302]
Což přesměruje na verzi s lomítkem vše, kde není v url tečka nebo lomítko.

A jen poznámka, že podmínka na řádku 9 a 10 platí jen pro řádek 12 a pro další už ne. Zvážil bych, zda to nepřidat před řádek 32. Nebo na začátku udělat negaci a ukončit přepisování pro exitující soubory a adresáře hned.

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

U přesměrování na řádcích 4 a 7 si přidejte flag NE.

Pravidla na řádcích 22-27 a 29 by šla zapsat do jednoho pravidla.
RewriteRule ^(forgotten_password|about-us|contact-us|instagram|register|thank-you|admin/logout)$ $1.php
a měla by být před přidáním lomítka, protože u nich v url není.

Výsledek by mohl být něco jako
RewriteEngine on
 
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
 
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^(forgotten_password|about-us|contact-us|instagram|register|thank-you|admin/logout)$ $1.php [L]
RewriteRule ^admin/$ admin/index.php [L]

RewriteRule ^([^./]+)$ https://%{HTTP_HOST}/$1/ [L,NE,R=302]
 
RewriteRule ^(.*)/about_us/(.*)/(.*)$ business_page.php?permalink=$1&id_pages=$2 [L]
RewriteRule ^(.*)/jobs/(.*)/(.*)$ business_jobs.php?permalink=$1&id_jobs=$2 [L]
RewriteRule ^cat/(.*)/(.*)$ about-us.php?id_categories=$1 [L]
RewriteRule ^confirm/(.*)/(.*)$ confirm.php?businesshash=$1&id_business=$2 [L]
RewriteRule ^(.*)/sitemap.xml$ business_sitemap.php?permalink=$1 [L]
RewriteRule ^(.*)/image_gallery$ business_image_gallery.php?permalink=$1 [L]
RewriteRule ^(.*)/product_catalogue$ business_product_catalogue.php?permalink=$1 [L]
RewriteRule ^(.*)/products/(.*)/(.*)$ business_products.php?permalink=$1&id_product_categories=$2 [L]
RewriteRule ^(.*)/product_detail/(.*)/(.*)$ business_product_detail.php?permalink=$1&id_product=$2 [L]
RewriteRule ^(.*)/contact_us$ business_contact.php?permalink=$1 [L]
RewriteRule ^(.*)/$ business_detail.php?permalink=$1 [L]
davchy
Profil
Mockrát Vám děkuji za řešení a zefektivnění.

Rád bych se ještě zeptal, zda je reálné, aby to celé fungovalo na virtuálních subdoménách úpravou pouze htaccess? Bylo by to zřejmě praktičtější, kdyby URL pak bylo virtualni-sub-drive-adresar.nejaky.web Virtuální adresář předem není znám, protože skript je vlastně jednoduchý veřejný tvůrce web prezentací, která jsou pak dostupná pod zvoleným názvem. Samozřejmě bych Vás v takovém případě pak jakoukoliv formou "pozval na kafe".
Kajman
Profil
Přepisování formou nějaký-text na jiný-nesouvisející-text je možné přes rewritemapy. Ale lepší by bylo, kdyby tu podporu subdomén poskytovala přímo aplikace.

A ćím větší projekt, tím je lepší .htaccess zakázat a vše mít nakonfigurované přímo u http serveru, ať to má v paměti a nemusí pokaždé koukat do souborů.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: