Перезапись подкаталога на параметр строки запроса - PullRequest
1 голос
/ 16 февраля 2020

У меня есть два требования:

  • Это, например, /product/12345 внутренне перенаправлено на /product/product.php?product=12345.
  • Это, если пользователь пытается получить доступ к /product/product.php в строка URL, она перенаправлена ​​на /product/ для аккуратности.

Отдельно, они оба работают правильно, но вместе это приводит к бесконечному l oop - я знаю, что я перенаправляю с /product/ до /product.php и обратно, но разница между внутренней и внешней, и я не уверен, как отличить guish между ними.

RewriteEngine On

RewriteRule ^product/product.php /product/ [NC,R=307,END]

RewriteCond %{REQUEST_URI} !^/product/product.php [NC]
RewriteRule ^product/(.*) /product/product.php?product=$1 [NC]

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

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

  1. Добавьте условие к первому RewriteRule, которое проверяет, является ли строка запроса пустой, то есть product/product.php без строка запроса перенаправляет на /product/.
  2. Измените (.*) во втором RewriteRule на (.+) или ([0-9]+), чтобы перезаписывать только запросы, содержащие идентификатор продукта (запросы на /product/ не перезаписываются) .
RewriteEngine On

RewriteCond %{QUERY_STRING}        ="" [NC]
RewriteRule ^product/product\.php$ /product/ [NC,R=307,END]

RewriteCond %{REQUEST_URI}  !^/product/product\.php [NC]
RewriteRule ^product/(.+)   /product/product.php?product=$1 [NC]
1 голос
/ 16 февраля 2020

доступ /product/product.php в строке URL, он перенаправляется на /product/ для удобства

Вы также можете перенаправить /product/product.php?product=12345 на соответствующий канонический URL (ie. /product/12345) - все, что вы можете сделать в том же правиле. Если продукт ID только цифра c, тогда вы должны соответствующим образом ограничить свое регулярное выражение - это также позволит избежать необходимости в дополнительном условии.

Например:

# Canonical redirect
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^(?:product=(\d*))?$ [NC]
RewriteRule ^product/product\.php$ /product/%1 [NC,R=307,L]

# Rewrite requests from "pretty" URL to underlying filesystem path
RewriteRule ^product/(\d*) /product/product.php?product=$1 [L]

Условие, которое проверяет переменную окружения REDIRECT_STATUS, необходимо для предотвращения перенаправления l oop в этом случае, поскольку строка запроса является полностью необязательной.

Путем ограничения соответствия только цифрами, мы избегаем необходимости в дополнительном условии для внутренней перезаписи, product.php не будет соответствовать. Если продукт id может содержать буквы, ограничьте шаблон, чтобы избежать точек (.), например. ([^./]*).

Включать флаг NC во внутреннюю перезапись можно только в том случае, если это строго необходимо, в противном случае это может создать проблему с дублированным содержимым.

...