Мод-переписать правила для манипулирования строкой запроса

0

Хорошо. Во-первых, я знаю, что есть несколько ответов на такой вопрос, как здесь, в StackOverflow, но они только помогли мне частично. К сожалению, многие ответы очень специфичны и помогают только в случае оригинального искателя. Поэтому было бы неплохо, если бы я мог получить объяснение, которое также может быть расширено для вопросов других пользователей (и для меня, если мне нужно использовать это на других страницах). Тем не менее, моя проблема заключается в следующем:

Я пытаюсь использовать mod_rewrite, чтобы упростить мои URL-адреса, чтобы мои пользователи могли легко вводить адресную строку. Поэтому мне нужно отредактировать.htaccess, чтобы скрыть внутренние расширения.php и отредактировать все ссылки на код, который нужно выполнить. Правила перезаписи, которые я нашел для работы, следующие:

Options +FollowSymLinks -MultiViews
RewriteEngine On

# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://localhost/website/$1 [R=301,L]

# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://localhost/website/$1 [R=301,L]

# Assume php file for extensionless php urls
RewriteRule ^([^/.]+)$ $1.php [L]

Они относятся только к внешнему перенаправлению, но для меня я не думаю, что внутреннее перенаправление было необходимо, так как я в порядке, просто написав краткую форму URL-адресов. Нет причин скрывать расширение, если вы просто добавляете их обратно в html-формы, правильно?

Я рисую страницы пользователей, получая имя пользователя с помощью метода GET.

www.webpage.com/userpage.php?view=username

Я хочу, чтобы URL-адрес стал

www.webpage.com/user/username

Когда я наконец получил правило, которое сработало для этого, файл CSS не загружался. Изображения могут быть загружены или не зависят от правила, которое я использовал. Я отменил тот, который я написал, потому что он не только делал это, но и добавлял пути в другое место.

RewriteRule ^(.*[^/]) userpage.php?view=$1 [QSA,L]

В основном это правило применяло "/userpage/" ко всем ссылкам в домене, независимо от того, что я ввел в адресную строку. И когда я набрал полный текст с помощью userpage.php, он переписал это на страницу пользователя/пользовательскую страницу/пользователя.

RewriteRule ^user/(\w+)/?$ userpage.php?view=$1

Было очень похоже, делали те же результаты, но не показывали изображения. Я знаю, что проблема здесь связана с относительными путями, но просто изменение всех путей к абсолюту удалит всю переносимость кода.

Я понимаю, что мне действительно нужно, чтобы это было ТОЛЬКО страницы с/user/на пути, который нужно переписать.

Я не только хотел бы понять, какие условности мне нужно применить к правилу, но только изменить то, что я хочу, а не все остальное, но мне очень понравилось бы, если бы кто-то мог сказать мне, есть ли способ для страницы быть недоступным по всему пути.

Например, www.fullpath.com/user/username отображает страницу, но www.fullpath.com/userpage?view=username будет недоступным.

  • 0
    Проблема CSS / изображения, безусловно, была освещена в других ответах ( <base href=> ). И переписывание user/username является одним из самых распространенных RewriteRules на самом деле. Не включает в себя работу над THE_REQUEST или QUERY_STRING. Пожалуйста, опишите, что именно вы попробовали, и как что-то «сломалось».
  • 0
    Я попытался исправить <base href => 'для проблемы CSS / изображения, но это не сработало. Я также попытался добавить полный путь к правилам и использовать RewriteBase, чтобы исправить это. Это тоже не сработало. Я действительно не помню, какой именно код я использовал, чтобы добраться до этого момента.
Показать ещё 3 комментария
Теги:
.htaccess
mod-rewrite
path

1 ответ

0

Сохраните свой.htaccess следующим образом:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

## Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/$ $1 [R=302,L,NE]

RewriteRule ^user/([^/]+)/?$ userpage.php?view=$1 [L,QSA,NC]

# To internally forward /dir/file to /dir/file.php
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f [NC]
RewriteRule ^(.+?)/?$ $1.php [L]

Также добавьте это в раздел <head> на странице HTML: <base href="/"/> чтобы каждый относительный URL был разрешен с этого URL-адреса, а не URL-адрес текущей страницы

  • 0
    Это просто заставляет пересылать внутренние ссылки. Внешние ссылки не работают. Поэтому, если вы введете « domain.com/page », он не будет работать, потому что не знает, что должен искать файл «.php».
  • 0
    Получаете ли вы 404 для domain.com/page ? Существует ли page.php ? domain.com/page.php ли domain.com/page.php ?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню