Переписать правила, не останавливаясь, когда правило соответствует [L], если переписанный файл не index.php - PullRequest
1 голос
/ 25 марта 2019

У меня довольно сложный файл .htaccess со многими RewriteRules, и до сих пор все работало хорошо, за исключением того, что я пытаюсь переписать в файл, который не index.php

Я попытался добавить [L], я запускаю его локально, используя xampp, и index.php и deleteItem.php являются допустимыми файлами. Также стоит отметить, что с моими правилами я больше не могу указывать прямо на файл PHP.

Вот мой файл .htaccess

<IfModule mod_rewrite.c>
  RewriteEngine On

  #RewriteBase /smartsharing/community/
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f

  RewriteRule ^.*?([^/]*)/members$ index.php?action=members&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]*)/members/$ index.php?action=members&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]*)/members/edit$ index.php?action=editMembers&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]*)/members/edit/$ index.php?action=editMembers&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]*)/items/edit$ index.php?action=editItems&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]*)/items/edit/$ index.php?action=editItems&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]*)/items/([^/]*)/purchasehistory$ index.php?action=purchaseHistory&id=$2 [L,QSA]
  RewriteRule ^.*?([^/]*)/items/([^/]*)/purchasehistory/$ index.php?action=purchaseHistory&id=$2 [L,QSA]
  RewriteRule ^.*?([^/]*)/items/([^/]*)/edit$ index.php?action=editItem&id=$2 [L,QSA]
  RewriteRule ^.*?([^/]*)/items/([^/]*)/edit/$ index.php?action=editItem&id=$2 [L,QSA]
  RewriteRule ^.*?([^/]*)/items/([^/]*)/remove$ deleteitem.php?id=$2 [L,QSA]
  RewriteRule ^.*?([^/]*)/items/([^/]*)/remove/$ deleteitem.php?id=$2 [L,QSA]
  RewriteRule ^.*?([^/]*)/edit$ index.php?action=edit&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]*)/edit/$ index.php?action=edit&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]+)$ index.php?action=details&id=$1 [L,QSA]
  RewriteRule ^.*?([^/]*)/$ index.php?action=details&id=$1 [L,QSA]

</IfModule>

Мой URL похож на http://localhost/smartsharing/community/communityname/items/2/remove

Я ожидаю, что переписанный URL будет http://localhost/smartsharing/community/deleteItem.php?id=2 но вместо этого, кажется, идти к http://localhost/smartsharing/community/index.php?action=details&id=2

Также при публикации на http://localhost/smartsharing/community/doAction.php вместо этого он перенаправляет на http://localhost/smartsharing/community/index.php?action=details&id=doAction.php

1 Ответ

2 голосов
/ 25 марта 2019

Проблема не в L, а в вашем правиле RewriteRule ^.*?([^/]+)$ index.php?action=details&id=$1 [L,QSA].

Пойманный шаблон ^.*?([^/]+)$ в вашем правиле сопоставляет все переписанные URI и переписывает их в /index.php?action=details&id.

Что происходит, когда вы переходите к:

/foobar/items/2/remove 

следующее правило соответствует

RewriteRule ^.*?([^/]*)/items/([^/]*)/remove/$ deleteitem.php?id=$2 [L,QSA]

Затем, чтобы загрузить целевой URL /deleteitem.php?I'd=124 вашсервер снова читает ваш файл htaccess, и следующие правила соответствуют

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

Сервер продолжает чтение файла htaccess, пока не найдены соответствующие правила.

Чтобы решить эту проблему, вы можете использовать END flagвместо L замените L на END в каждом правиле.Флаг END гарантирует, что правило запускается только в текущем цикле перезаписи или помещает RewriteConds над правилом, чтобы оно не перезаписывало существующие файлы или URI.

RewriteCond %{REQUEST_FILENAME} !-f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...