Правило перезаписи htaccess для URL - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу иметь отформатированный URL-адрес, например:

www.mysite.com/view.php?id=1

, где:

"id" range: 1-99 (without leading "0" from 1 to 9)
"id": always lowercase, no "Id" or "ID" or "iD"

Все, что отличается от этого формата, должно перенаправлять его на www.mysite.com/view.php или отформатированный ID значение:

Примеры:

www.mysite.com/view.php?id=1sdeW --> www.mysite.com/view.php?id=1
www.mysite.com/view.php?erwrrw34 --> www.mysite.com/view.php
www.mysite.com/view.php?id=01 --> www.mysite.com/view.php?id=1
www.mysite.com/view.php?ID=33 --> www.mysite.com/view.php?id=33

Я уже сделал некоторую часть этой логики ( RegExp , htaccess , rewriterules ):

Пожалуйста, помогите завершить полную логику выше.

RewriteEngine On
RewriteCond %{QUERY_STRING} ID=([0-9]+)
RewriteRule ^(.*)$ /view.php?id=%1 [R=301,L]

РЕДАКТИРОВАТЬ # 1

Я упростила свой подход для достижения тех же результатов:

   RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_URI} ^/view.php$
   RewriteCond %{QUERY_STRING} ^(?!(id=[1-9][0-9]{0,1})$).*$
   RewriteRule .* ? [R=301,L]

1) С помощью:

   RewriteRule .* ? [R=301,L]

Это работает, но ссылка, размещенная внутри моей веб-страницы на:

   www.mysite.com/view.php

также перенаправляет на:

   www.mysite.com

2) С помощью:

   RewriteRule .* /view.php? [R=301,L]

Я получаю хорошо известную петлю "СЛИШКОМ МНОГИЕ НАПРАВЛЕНИЯ".

Как мне от этого избавиться?

1 Ответ

0 голосов
/ 26 декабря 2018

Главное, чтобы вы обрабатывали только те URL, которые начинаются с /view.php.Далее, когда вы используете RewriteRule, вам не нужно захватывать URL, используя ^(.*)$.Наконец, разделите логику на меньшие обработчики.

# Correct the wrong case for the "id" parameter
RewriteCond %{REQUEST_URI} ^/view.php$
RewriteCond %{QUERY_STRING} (ID|Id|iD)=(\d+)
RewriteRule . /view.php?id=%2 [R=301,L]

# Make sure that "id" contains only digits
RewriteCond %{REQUEST_URI} ^/view.php$
RewriteCond %{QUERY_STRING} id=([1-9]\d*)[^&]+
RewriteRule . /view.php?id=%1 [R=301,L]

# Check if the current URL contains "view.php?" but doesn’t have a valid "id" string
RewriteCond %{THE_REQUEST} ^[A-Z]+\s+/view.php\?
RewriteCond %{QUERY_STRING} !(id=[1-9])
RewriteRule . /view.php? [R=301,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...