#.htaccess #mod-rewrite
#.htaccess #мод-перезапись
Вопрос:
У меня есть следующая страница: www.domain.com/index.php?route=information/contact
и я хотел бы переписать ее так, чтобы она отображалась как: www.domain.com/contact
, но это еще не все…
Важно то, что когда кто-то вводит www.domain.com/contact
, он перенаправляет их на www.domain.com/index.php?route=information/contact
, который, в свою очередь, переписывается как www.domain.com/contact
.
Я ценю любую помощь! Спасибо.
Редактировать: Для уточнения
Я хочу, чтобы пользователи могли вводить www.domain.com/contact
и перенаправляться на www.domain.com/index.php?route=information/contact
.
Однако после перенаправления я хотел бы, чтобы чисто эстетическая перезапись, чтобы она www.domain.com/index.php?route=information/contact
отображалась как www.domain.com/contact
(такая же, как то, что они ввели.)
Возможно ли это?
Редактировать: мой файл .htaccess в данный момент…
Options FollowSymlinks
# Prevent Directoy listing
Options -Indexes
# Prevent Direct Access to files
<FilesMatch ".(tpl|ini)">
Order deny,allow
Deny from all
</FilesMatch>
# SEO URL Settings
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)?*$ index.php?_route_=$1 [L,QSA]
RewriteCond %{QUERY_STRING} ^route=common/home$
RewriteCond %{REQUEST_METHOD} !^POST$
RewriteRule ^index.php$ http://www.domain.com/? [R=301,L]
### Additional Settings that may need to be enabled for some servers
### Uncomment the commands by removing the # sign in front of it.
### If you get an "Internal Server Error 500" after enabling, then restore the # as this means your host
doesn't allow that.
# 1. If your cart only allows you to add one item at a time, it is possible register_globals is on. This
may work to disable it:
# php_flag register_globals off
Комментарии:
1. То, что вы описываете, приведет к бесконечному перенаправлению… перенаправить контакт -> index.php?маршрут= информация / contact перенаправить index.php?маршрут=информация / contect -> contact Вы уверены, что это то, что вы пытаетесь сделать?
2. @David — Я хочу, чтобы
index.php?route=information/contact
был переписан только (не перенаправлен)… чисто эстетически — но суть в том, что люди должны иметь возможность вводить эстетический URL-адрес и перенаправлять его на реальный URL-адрес … который будет (только по внешнему виду) таким же, как эстетический URL.3. Но эстетичный URL в любом случае придется переписать. Почему бы просто не использовать функциональный URL для запуска скрипта?
4. @Ignacio — простите за мое невежество, но я обращаюсь за помощью, потому что понятия не имею, как это сделать — так что то, что вы предлагаете, пролетело прямо у меня над головой. Если то, чего я пытаюсь достичь, понятно, можете ли вы опубликовать решение, которое я могу попробовать?
5. Почему вы не используете фреймворк? У Django (Python) есть красивые URL, у Rails (Ruby) они тоже есть, у Recess (PHP) они есть, так что вы можете выбрать фреймворк на языке по вашему выбору. Здесь вы имеете дело с решаемой проблемой.
Ответ №1:
Попробуйте эти правила в вашем файле .htaccess:
Options FollowSymlinks -MultiViews
RewriteEngine on
RewriteCond %{THE_REQUEST} ^GETs/ index.php [NC]
RewriteCond %{QUERY_STRING} ^route=information [NC]
RewriteRule . /warranty? [L,NC,R=301]
RewriteRule ^warranty$ /index.php?route=information/contact [L,NC]
L
гарантирует, что URL пользователя в браузере не изменится и перенаправление произойдет внутри.
Комментарии:
1. @anubhava — Похоже, вы усекаете URL … выше были просто примеры, фактическая перезапись должна указывать
www.domain.com/index.php?route=information/contact
наwww.domain.com/warranty
… поскольку контактная форма на самом деле предназначена для регистрации гарантии на продукт — как бы изменился код в вашем примере для этого? Я не подумал о путанице / сходстве «контакт» и «информация / контакт».2. Отредактировал ответ выше, чтобы отразить
/index.php?route=information/contact
на/warranty
. Поскольку ваш исходный URI здесь не имеет ссылки на целевой URI/warranty
поэтому для каждого подобного правила вам придется добавить 1 строку RewriteRule, как в моем ответе.3. @anubhava — Хм, я вставил этот код туда … ввел
www.domain.com/warranty
и ничего не произошло. Я ввелwww.domain.com/index.php?route=information/contact
вручную, и все же строка URL не изменилась. Я делаю что-то не так?4. Отредактировал мой ответ, чтобы убедиться, что правило работает в обоих направлениях, пожалуйста, попробуйте еще раз.
5. @Anubhava — Спасибо за вашу помощь! Не могли бы вы взглянуть на файл .htaccess выше — чтобы увидеть, нет ли чего-нибудь конфликтующего? перезапись, похоже, работает, но когда я перехожу
www.domain.com/warranty
, я получаю 404. Если я перейдуindex.php?route=information/contact
, он перенаправит, и я получу тот же 404… может быть, это конфликт с платформой?
Ответ №2:
Ваш вопрос крайне неясен, и я подозреваю, что виновата неопытность.
С помощью следующего правила:
RewriteRule /?(.*) index.php?route=information/$1
в строке местоположения будет указано «/contact», но index.php будет вызван с помощью внутренней перезаписи.
С небольшой модификацией:
RewriteRule /?(.*) index.php?route=information/$1 [R]
строка местоположения будет читать «/index.php?route=information / contact» и index.php будет вызвано после перенаправления.
Как всегда, правило должно соответствовать соответствующему RewriteCond
, чтобы избежать перезаписи, если запрашивается фактический файл.
Комментарии:
1. @Ignacio — Смотрите мой комментарий к ответу Анубхавы. Приношу свои извинения за путаницу — я не думал, что люди попытаются сократить URL, чтобы показывать только ‘contact;’ в идеале
www.domain.com/whatever-I-pick
было бы указывать наwww.domain.com/index.php?route=information/contact
, оставив строку URL отображаемойwww.domain.com/whatever-I-pick
.2. Итак, затем используйте прежнее правило, заменив LHS соответствующим образом.
3. будет ли условие выглядеть следующим образом?
RewriteCond %{QUERY_STRING} ^route=information/contact$
Кроме того, что такое LHS? Я попытался использовать первую строку предоставленного вами кода, и это убило мой CSS (и никаких изменений / перенаправлений URL не произошло.)4. Нет.
RewriteCond %{REQUEST_FILENAME} !-f
5. @Ignacio — Позвольте мне сначала сказать, что я ценю вашу помощь. Я отредактировал свой исходный пост с помощью моего текущего файла .htaccess — я не внес никаких изменений в htaccess — вы видите механизмы, которые мне было поручено ввести для перезаписи URL в рамках этой установки Opencart. Как вы можете видеть,
www.domain.com/index.php?route=common/home
настроено перенаправление наwww.domain.com
, а другое правило предназначено для перезаписи URL продукта. Я пытаюсь сделать страницуwww.domain.com/index.php?route=information/contact
доступной путем вводаwww.domain.com/warranty
без видимого изменения URL.
Ответ №3:
AFAIK, вы не можете заставить адресную строку отображать адрес, отличный от того, с которого была загружена страница. Если вы хотите, чтобы пользователь видел www.domain.com/contact
в адресной строке при просмотре страницы, вам нужно заставить сервер фактически возвращать содержимое страницы (не перенаправлять), когда запрашивается этот URL.
Я думаю, вы, возможно, неправильно понимаете переписывание URL: оно предназначено не для изменения того, что пользователь видит в адресной строке, а для изменения того, что видит сервер, когда поступает запрос от пользователя. Если вы создаете правило перезаписи, которое изменяется /foo
на /bar
, то, когда пользователь вводит /foo
в своем браузере, сервер будет рассматривать это как запрос на /bar
.
Я думаю, вы хотите, чтобы, когда пользователь вводит www.domain.com/contact
текст в своем браузере, сервер обрабатывал это как запрос на www.domain.com/index.php?route=information/contact
, но браузер все равно должен показывать красивый URL, который ввел пользователь. Способ сделать это — просто переписать /contact
в /index.php?route=information/contact
на сервере. Перенаправление не требуется; пользователь просто запрашивает красивый URL, а сервер обрабатывает запрос на основе эквивалентного уродливого URL и отправляет обратно результирующую страницу.