2009-10-06 4 views
0

Эй, ребята, я пытаюсь реализовать один из ответов, которые я получил, на другой вопрос, который я задал здесь пару дней назад. Вы можете найти оригинальный вопрос здесь: Mod_rewrite clarification question. Only for dynamic urls?.htaccess правило help help

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

I'm guessing the answer meder gave is the one you're looking for but technically you can create a static map file to redirect a set of title strings to ids and it doesn't have to execute an external prg executable:

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] 

with the contents of the /tmp/title_to_id.txt file something like this:

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

Ok достаточно фона. Мой файл .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. RewriteMap direction может быть использован только в server configuration or virtual host context.

  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. Как я предполагаю, что эти адреса не могут быть непосредственно отображены к существующим файлам или каталогам, ваше первое правило поймает их, прежде чем переписывать их. Таким образом, вы должны изменить порядок, что правила, чтобы иметь конкретные правила, примененные до захвата всех один:

    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] 
    
+0

Спасибо за ваш ответ Gumbo! С RewriteMap мне просто нужно добавить его в файл httpd.conf, и {static-title-to-id: $ 1} должен работать? Или мне нужно каким-то образом вызвать файл httpd.conf? –

+0

@ivannovak: Нет, просто добавьте его в свой файл httpd.conf и перезапустите Apache, так как файл httpd.conf читается только один раз в начале Apache. – Gumbo

+0

@Gumbo: Мой .txt файл карты генерируется скриптом php. Как автоматизировать обнаружение новых правил карты каждый раз, когда добавляется новое сообщение? Или это пища для другого вопроса? –