RewriteRule не работает нормально - PullRequest
2 голосов
/ 04 февраля 2012

Я написал следующее правило в .htaccess

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)/$ profile.php?business=$1

При вводе URL-адреса, например http://www.abc.com/mujeeb/

, страница правильно переносится на страницу профилей, и страница выглядит нормально.

Но я ввожу это в URL http://www.abc.com/mujeeb

страница не отображается.

Подскажите, пожалуйста, почему?Или напишите правило для этого?Я пытался много раз, но безуспешно.

Mujeeb.

Ответы [ 5 ]

1 голос
/ 04 февраля 2012

Это потому, что вы проверяете косую черту с помощью ^(.*)/$.Если вы добавите знак вопроса, косая черта будет необязательной.

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)/?$ profile.php?business=$1

RewriteCond необходим для того, чтобы правило применялось только один раз.В противном случае Apache попадет в бесконечный цикл.

1 голос
/ 04 февраля 2012

page doesn't show., поскольку вы указали, что RewriteRule применяется к URL-адресу, заканчивающемуся / в конце.Перепишите его как

RewriteRule ^(.*)/?$ profile.php?business=$1 [L]

И я надеюсь, что у вас есть дополнительные операторы RewriteCond для предотвращения бесконечного цикла с перенаправлениями.

ps: в принципе вы можете предотвратить цикл двумя способами

1) проверяет, что запрошенный URL не соответствует существующему файлу или каталогу.это, вероятно, лучший способ сделать (прочитайте комментарии ко второму методу)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ profile.php?business=$1 [L]

2) проверки, что вы запрашиваете не файл из RewriteRule.Этот метод не подходит, потому что для каждого запроса, даже для существующих файлов и каталогов, он вызывает скрипт profile.php

RewriteCond %{REQUEST_URI} !profile\.php$
RewriteRule ^(.*)/?$ profile.php?business=$1 [L]
0 голосов
/ 04 февраля 2012

Много хороших ответов уже. Мой ответ немного другой.

Это то, что я обычно делаю. Если запрошенный URL-адрес не заканчивается на /, я заставляю браузер перенаправить на URL-адрес с завершающим / Это соответствует поведению Apache по умолчанию (из-за mod_dir). Вот как я решаю эту проблему.

RewriteEngine On

# Canonicalize http://example.com/mujeeb to http://example.com/mujeeb/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)([^/])$ /$1$2/ [R=307,L]

# Let profile.php process http://example.com/mujeeb/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ profile.php?business=$1
0 голосов
/ 04 февраля 2012

Ну, вы, как правило, проверяете косую черту в URI , и именно поэтому /mujeeb/ работает, а /mujeeb - нет.Измените свой код на:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
# If the request is not for a valid file
#RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid directory
#RewriteCond %{REQUEST_FILENAME} !-f

# your rule without trailing slash
RewriteRule ^(.*)$ profile.php?business=$1 [L,QSA]
0 голосов
/ 04 февраля 2012

Попробуйте это:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)[/]?$ profile.php?business=$1

Это делает последний слеш необязательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...