У меня есть следующие правила: один «наш магазин» перенаправляет в другое место, чем другие правила «PLAIN PAGES»:
Options +FollowSymlinks RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RedirectMatch 302 /construction.html http://www.{website}.com/construction-services RedirectMatch 302 /construction/endless-pools.html http://www.{website}.com/construction-services/endless-pools # PRODUCT AND SERVICES RewriteCond %{REQUEST_URI} !\.html$ RewriteRule ^(.*)/(.*)$ /rewrite.php?sub=$1&second=$2 [NC] # PLAIN PAGES #RewriteRule ^/$ /index.php [L,NC] RewriteRule ^signup-free$ /signup-free.php [L,NC] RewriteRule ^about$ /content.php?page=1 [L,NC] RewriteRule ^links$ /content.php?page=2 [L,NC] RewriteRule ^portfolio$ /portfolio.php [L,NC] RewriteRule ^our-stores$ /our-stores.php [L,NC] RewriteRule ^contact$ /contact.php [L,NC] RewriteRule ^products-list$ /lists.php?action=products [L,NC] RewriteRule ^services-list$ /lists.php?action=services [L,NC]
Когда я печатаю /our-stores
apache перенаправляет на: /our-stores/?sub=our-stores&second=
Я не понимаю, потому что остальные (без регистрации, о, ссылки, портфолио … и т. Д.) Работают нормально.
Может ли кто-нибудь помочь мне с этим?
Спасибо.
Общее правило было перенесено в нижнее положение, а условия REQUEST_FILENAME
переместились под статические перенаправления. Кроме того, я добавил /?
чтобы сопоставить необязательную конечную косую черту для каждой конкретной переадресации. Наконец, общее правило улучшено не для использования .*
, А скорее для соответствия всем до первого /
менее жадным способом. Затем он использует .+
После /
чтобы убедиться, что присутствует хотя бы один символ. Таким образом, URL-адреса с конечной косой чертой не совпадают. Если у вас есть какие-то дженерики без second=
, вернитесь к .*
.
Все они работают правильно в тесте htaccess.
RedirectMatch 302 /construction.html http://www.{website}.com/construction-services RedirectMatch 302 /construction/endless-pools.html http://www.{website}.com/construction-services/endless-pools RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^signup-free/?$ /signup-free.php [L,NC] RewriteRule ^about/?$ /content.php?page=1 [L,NC] RewriteRule ^links/?$ /content.php?page=2 [L,NC] RewriteRule ^portfolio/?$ /portfolio.php [L,NC] RewriteRule ^our-stores/?$ /our-stores.php [L,NC] RewriteRule ^contact/?$ /contact.php [L,NC] RewriteRule ^products-list/?$ /lists.php?action=products [L,NC] RewriteRule ^services-list/?$ /lists.php?action=services [L,NC] # PRODUCT AND SERVICES RewriteCond %{REQUEST_URI} !\.html$ RewriteRule ^([^/]+)/(.+)$ /rewrite.php?sub=$1&second=$2 [NC]
Знак «-» является специальным символом в регулярном выражении. Он определяет диапазон (az, à-9 и т. Д.).
Попытайтесь избежать этого.
RewriteRule ^our\-stores$ /our-stores.php [L,NC]
Я подозреваю, что у вас есть фактический файл (или, скорее, пустой каталог) с именем our-stores
.
Это вызовет RewriteCond %{REQUEST_FILENAME} !-d
, в результате чего он не будет переписываться.
Затем он попытается загрузить страницу по умолчанию из этого каталога (например, index.php), которая не существует, и поэтому она попытается переписать это, в результате чего добавятся добавленные опции ?sub=our-stores&second=
.