Правило перезаписи работает в тестере, но не в .htaccess - PullRequest
1 голос
/ 30 января 2020

Я сделал RewriteRule для хороших ссылок SEO. Я разработал его на https://htaccess.madewithlove.be/, где он работает, как ожидалось.

Но когда я внедряю его на своем веб-сайте, он не работает, и сервер падает.

RewriteEngine On
RewriteRule ^(.+?(?=/))/(.+?)/?$ index.php?a=$1&b=$2 [QSA,L]
RewriteRule ^(.+?)/?$ index.php?a=$1 [QSA,L]
RewriteRule ^/?$ index.php [NC,L]

Я ожидаю:

https://example.com/> https://example.com/index.php

https://example.com/page> https://example.com/index.php?a=page

https://example.com/page/categorie> https://example.com/index.php?a=page&b=categorie

1 Ответ

1 голос
/ 30 января 2020

Ваши правила приведут к перезаписи l oop, поскольку второе правило будет соответствовать переписанному URL-пути, ie. index.php.

Вы можете просто добавить исключение, которое предшествует существующим перезаписям:

RewriteRule ^index\.php$ - [L]

Если запрос соответствует /index.php (что он делает после первой перезаписи), затем прекратить обработку .

И / ИЛИ, сделайте свое регулярное выражение более строгим (что будет рекомендовано в любом случае). Например, вместо сопоставления чего-либо, ie. .+, соответствует только символам слова, например. \w+. (Совпадения a-z, A-Z, 0-9 и _). и др c. Или сопоставьте что-нибудь, кроме sla sh или точка, например. [^/.]+. Тогда вам не нужно будет делать подшаблоны не жадными (во избежание совпадения с дополнительным конечным sla sh).

ОБНОВЛЕНИЕ: Если вы обслуживаете другие данные c ресурсы, тогда вам может потребоваться выполнить проверку файловой системы, чтобы убедиться, что перезаписываемый запрос еще не сопоставлен с файлом (или каталогом). Это обычная практика, однако, она относительно дорогая (с точки зрения обработки), и ее часто можно избежать, сделав регулярное выражение более ограничительным - как упомянуто выше.

Например:

RewriteEngine On

# Ignore (rewritten) requests for index.php
RewriteRule ^index\.php$ - [L]

# Ignore requests that map to files or directories
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# Rewrite pretty URLs
RewriteRule ^(\w+)/(\w+)/?$ index.php?a=$1&b=$2 [QSA,L]
RewriteRule ^(\w+)/?$ index.php?a=$1 [QSA,L]
RewriteRule ^/?$ index.php [NC,L]

Обратите внимание, что если вам нужно принимать дефисы (-) как часть сегмента пути URL, то измените \w на [\w-] - чтобы добавить дефисы в класс символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...