Помогают конфликты правил .htaccess - PullRequest
0 голосов
/ 06 октября 2009

Эй, ребята, я пытаюсь реализовать один из ответов, которые я получил на другой вопрос, который я задал здесь пару дней назад. Вы можете найти оригинальный вопрос здесь: Mod_rewrite уточняющий вопрос. Только для динамических URL?

Самый полезный ответ, который я моделирую после реализации, следующий:

Я предполагаю, что ответ, который дал meder, - это тот, который вы ищете, но технически вы можете создать файл статической карты, чтобы перенаправить набор строк заголовка на идентификаторы, и он не должен выполнять внешний исполняемый файл prg:

  RewriteMap static-title-to-id txt:/tmp/title_to_id.txt
  RewriteRule ^/health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]

с содержимым файла /tmp/title_to_id.txt примерно так:

  how-do-I-lose-10kg-in-12-weeks 999
  some-other-title 988
  and-another 983

Хорошо, достаточно фона. Мой файл .htaccess в настоящее время содержит следующее:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Это типичная настройка постоянных ссылок WordPress. Однако, когда я пытаюсь добавить правила, подобные тем, которые представлены в выбранном ответе выше, я получаю внутреннюю ошибку сервера.

Это мой файл .htaccess, когда я получаю внутреннюю ошибку сервера:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteMap static-title-to-id txt:/tmp/title_to_id.txt
RewriteRule ^/health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
</IfModule>

Я надеюсь, что моя проблема - нечто простое, например, конфликт правил. Если вы видите ошибку или можете указать здесь какое-либо направление, это будет высоко оценено.

1 Ответ

1 голос
/ 06 октября 2009

В вашем коде четыре ошибки:

  1. Направление RewriteMap может использоваться только в конфигурации сервера или в контексте виртуального хоста .

  2. При использовании mod_rewrite в файле .htaccess, mod_rewrites сначала удаляет префикс для каждого каталога из пути URL-адреса перед проверкой правил и повторно добавляется после применения правила. В случае если .htaccess находится в корневом каталоге, префикс пути будет удален /. Поэтому вам нужно указать шаблон пути без префикса:

    RewriteRule ^health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
    
  3. Подстановка вашего правила также будет соответствовать этому же правилу. Это привело бы к бесконечному циклу. Таким образом, вам нужно либо изменить шаблон или замену, чтобы избежать этого. В вашем случае лучше изменить шаблон, например:

    RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
    

    Вы также должны указать конец пути URL:

    RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/$ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
    
  4. Поскольку я предполагаю, что эти URL не могут быть напрямую сопоставлены с существующими файлами или каталогами, ваше первое правило будет перехватывать их, прежде чем переписать их. Поэтому вы должны изменить порядок этих правил, чтобы конкретное правило применялось перед всеобъемлющим:

    RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/$ /health-and-fitness-tips/${static-title-to-id:$1}/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    
...