2015-08-20 2 views
2

Я пробовал некоторые другие ответы, которые я мог найти здесь, но это не сработало. Это действительно просто.Реализация «дружественных» URL-адресов с использованием .htaccess

Я хочу

/page?id=PAGENAME 

быть доступным и перенаправляется

/PAGENAME 

Можете ли вы мне помочь?

EDIT:

Он чувствует, как моя уже запутанных вверх .htaccess файл должен быть включен здесь. У меня уже включена базовая перезапись, но эта функция необходима для двух других «специальных страниц». В запрошенном выше решении я бы поэтому просто заменил «страницу» на два pagenames (это датские имена, поэтому я решил, что это проще).

В настоящее время у меня есть это. Если у вас есть какие-либо улучшения в этом, это оценено - но я просто хочу, чтобы это работало с запрошенным решением.

# Options -Multiviews -Indexes +FollowSymLinks 
RewriteEngine On 
RewriteBase/

# Always on https 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

# remove trailing slash 
#RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L] 

#301 Redirect everything .php to non php 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+\.)+php?\ HTTP 
RewriteRule (.+)\.php?$ http://MYURL.dk/$1 [R=301,L] 

#Hide the .php from url 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

#301 Redirect everything mistype after file extension - 

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

#301 Redirect everything to current url - 
RedirectMatch permanent /(.*).php/.* http://MYURL.dk/$1.php 

RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

#301 Redirect from non www to www 
RewriteCond %{HTTP_HOST} ^www.MYURL.dk [NC] 
RewriteRule (.*) http://MYURL.dk/$1 [R=301,L] 

#301 redirect index.php to/
RewriteBase/
RewriteCond %{REQUEST_URI} index.php 
RewriteRule .* http://MYURL.dk/ [R=301,L] 

#Deny access to songs 
RewriteCond $1 !(loadmedia)\.php 
RewriteRule ^songs/(.*)$ - [L,F] 
+0

«просто заменить' page' с двумя Имена страниц»- Я полагаю, вы имеете в виду' pagename' ? В вашем текущем файле .htaccess есть некоторые вещи, которые по крайней мере нуждаются в «уходе». Я не думаю, что '-D' является допустимым атрибутом? Похоже, вы должны проверить каталог, который является '-d' (строчный). Кроме того, порядок директив важен. Внешние переадресации должны поступать во внутренние перезаписи. У вас есть канонические переадресации в конце вашего файла - они должны быть наверху! Включите только «RewriteEngine» и «RewriteBase». Не смешивайте переадресацию mod_alias и mod_rewrite. – MrWhite

ответ

1

Обычно URL в адресной строке должен быть как

www.siteurl.com/pagename/ для сео цели, а затем прочитать этот адрес из .htaccess, используя правила, которое дает эти значения параметров строки запроса в файле PHP.

правило .htaccess может быть как

RewriteRule ^(.*)/$ /page?id=$1 [QSA,L] 
+0

(+1) Тем не менее, я бы не закончил URL-адрес в косой чертой, если это специально не нужно для _look like_ a directory. – MrWhite

+0

Спасибо. Но точно. Я не хочу косой черты - и если я удалю косую черту с вашей корелинга, я получаю ошибку внутреннего сервера. Кроме того, я все еще могу получить доступ к/page? Id = ID - мне нужно, чтобы это было перенаправлено. –

0

Похоже, что вы желаете, чтобы реализовать «дружественные» (или «довольно») URL-адреса, что делает URL-адреса более дружественным для вас пользователей (поисковые системы не действительно обращайте внимание на то, как выглядят ваши URL-адреса).

Первый шаг - изменить все ссылки на странице, чтобы использовать новый «дружественный» URL-адрес. Таким образом, вы должны иметь все формы: /pagename (не /page?id=PAGENAME).

Затем в .htaccess, вам нужно внутренне переписать этот «дружественный» URL в реального URL, который понимает ваш сервер. Это можно сделать с помощью mod_rewrite. В .htaccess файл в корневом каталоге:

# Enable the rewrite engine 
Options +FollowSymLinks 
RewriteEngine On 

# Rewrite the "friendly" URL back to the real URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !^id= 
RewriteRule ^([\w-]*) /page?id=$1 [L] 

Если файл не существует (!-f) и не содержит id URL из параметров, то внутренне переписать запрос от /<pagename> к /page?id=<pagename>. Предполагается, что ваш <pagename> состоит только из символов a-z, A-Z, 0-9, _ и -.

Если это новый сайт, а старые URL-адреса уже не проиндексированы или не указаны внешними сайтами, вы можете остановиться здесь.

Однако, если вы хотите изменить существующую структуру URL, то вы также должны извне перенаправить реальное (некрасиво) URL в «дружественный» URL перед тем выше внутренних переписывают. (Это на самом деле то, что вы задаете в своем вопросе.) Чтобы предотвратить цикл перезаписи , мы можем проверить его на %{THE_REQUEST} (который не изменяется при перезаписи URL-адреса).

# Redirect real URLs to "friendly" URLs 
RewriteCond %{THE_REQUEST} \?id=([\w-]*) 
RewriteRule ^page$ /%1? [R=302,L] 

Изменение 302 (временно) в 301 (постоянный), когда вы уверены, что это работает нормально. Постоянные переадресации кэшируются браузером, поэтому могут быть проблемы с тестированием.

Так, в целом, с указанными выше двух частей показаны вместе:

# Enable the rewrite engine 
Options +FollowSymLinks 
RewriteEngine On 

# Redirect real URLs to "friendly" URLs 
RewriteCond %{THE_REQUEST} \?id=([\w-]*) 
RewriteRule ^page$ /%1? [R=302,L] 

# Rewrite the "friendly" URL back to the real URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !^id= 
RewriteRule ([\w-]*) /page?id=$1 [L] 

Порядок директив имеет важное значение. Внешние переадресации должны почти всегда появляться до внутренние перезаписи.


UPDATE # 1:

Я хочу /concept?id=NAME пойти в /NAME и /studio?id=NAME ехать в /NAME - есть 5-10 различных "страницы" от обоих concept и studio. [Исправлено в соответствии позже комментарий]

С id=NAME сопоставляется /NAME вы можете достичь всего 10-20 перенаправляет только с одним правилом:

RewriteCond %{QUERY_STRING} ^id=(NAME|foo|bar|baz|abc|def|ghi) 
RewriteRule ^(concept|studio)$ /%1? [R,L] 

Это будет перенаправлять URL, такие как /studio?id=foo к /foo.

Как и все внешние перенаправления это должно быть одним из первых правил в вашем файле .htaccess.

Смена R на R=301, когда вы проверили, что он работает нормально.

Чтобы сделать это более «динамическим», т.е. соответствовать любой "NAME", а затем изменить CondPattern, например:

RewriteCond %{QUERY_STRING} ^id=([\w-]*) 

UPDATE # 2:

Если путь часть URL (т. е concept или studio) требуется то вы можете изменить замену RewriteRule следующим образом:

RewriteCond %{QUERY_STRING} ^id=([\w-]*) 
RewriteRule ^(concept|studio)$ /$1/%1? [R,L] 

Wh ich перенаправит /concept?id=foo в /concept/foo.

Или, чтобы быть полностью «динамический» (имея в виду, что это теперь будет захватить ничего):

RewriteCond %{QUERY_STRING} ^id=([\w-]*) 
RewriteRule ^([\w-]+)$ /$1/%1? [R,L] 
+0

Большое спасибо за вашу помощь! К сожалению, это не сработало, поэтому я отредактировал свой вопрос с дальнейшими подробностями. Я думаю, что это может быть что-то с моим существующим .htaccess. –

+0

Итак, чтобы уточнить, вам нужно перенаправить только 2 URL (не общий перенаправление) из '/ page? Id = ' to '/ ' и то же для # 2? Вам не нужно внутреннее переписывание (это следует), потому что ваше приложение уже справляется с этим - это правильно? Примечание (как я уже отмечал выше) внешние перенаправления должны появляться перед всеми вашими другими директивами в самом верхнем углу вашего файла .htaccess. – MrWhite

+0

Извините за мой поздний ответ. Я проверю ошибки в моем текущем .htaccess - я получил его некоторое время назад от кого-то другого, и он работает - но да, я не умею переписывать, поэтому большую часть времени я использую фрагменты. Но для того, чтобы уточнить: помимо того, что делает фактическое .htacces, я хочу/concept? Id = NAME перейти в/name и/studio? Id = NAME, чтобы перейти в/name - есть 5-10 разных «страниц» как из концепции, так и из студия. Я не мог заставить его работать с вашим кодом выше в сочетании с моим фактическим .htaccess (после того, как я изменил «страница» -> «концепция»/«студия»). –

Смежные вопросы