Apache Mod переписать помощь - PullRequest
0 голосов
/ 09 июля 2011

Я работаю над решением этой проблемы уже несколько часов и подумал, что если кто-то не против помочь мне, это может сэкономить мне время.Мой вопрос касается Apache mod_rewrite;конечно, есть тонна документации, но ничего конкретного для моих требований:

, чтобы получить URL в этом формате:

language/pagename.php

(язык будет либо «английский»или «французский», я напишу отдельное правило для каждого. [нужен только пример для одного]. Имя страницы будет любым символом слова (w+). Все URL будут иметь расширение .php).

А затем переписать его, чтобы URL-адрес не изменился в браузере пользователя, но чтобы php мог получить его в следующем формате:

language/page.php?slug=pagename

например, чтобы $_GET['slug'] вернул значение pagenameи все запросы затем обрабатываются page.php.

Пока что мое лучшее предположение -

RewriteEngine On
RewriteBase /
RewriteRule ^english/(\w+).php$ english/page.php?slug=$1

Однако это заставляет php сказать мне, что slug=page для этого URL, например english/financial.php;вместо financial.

Пробовал множество других соглашений регулярных выражений тоже (.) вместо w и т. д.

1 Ответ

0 голосов
/ 09 июля 2011

Используйте эти правила:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(english|french)/([^/\.]+)\.php$ /$1/page.php?slug=$2 [NC,QSA,L]
  1. Это необходимо поместить в файл .htaccess в корневой папке.Если вы будете размещать его в конфигурационном файле (например, httpd-vhost.conf, внутри директивы <VirtualHost>), тогда правило нужно слегка изменить.

  2. Это правило должно работать для любого языка, так какПока вы добавляете его в правило (english|french часть).

  3. Это правило имеет условие, которое не будет перезаписываться, если такой файл уже существует. Это должно решить вашу проблему с slug=page: в вашем правиле, скорее всего, у вас есть цикл перезаписи (после того, как перезапись происходит, она переходит к следующей итерации - так работает mod_rewrite, и вам нужно иметь некоторую логикуна месте, чтобы разорвать эту петлю).Вместо RewriteCond %{REQUEST_FILENAME} !-f вы можете использовать RewriteCond %{REQUEST_URI} !^/(english|french)/page\.php [NC], но его немного сложнее поддерживать (вам нужно добавить языки здесь, а также в само правило перезаписи).

  4. Если выуже есть некоторые другие правила переписывания, затем позаботьтесь о том, чтобы поместить их в правильное место (порядок правил имеет значение).

  5. Поскольку я точно не знаю, какими будут названия страниц (слагы),Я использовал этот шаблон: [^/\.]+ (любые символы, кроме / или .) .. но вы можете изменить его на \w+ или как вам будет лучше.

  6. Правило сохранения любых необязательных параметров страницы (строки запроса) - полезно для сохранения ссылок / кода отслеживания и т. Д.

...