Как мне переписать URL, чтобы перезапись можно было ввести в строку URL?

#.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 и отправляет обратно результирующую страницу.