у меня есть .htaccess
файл, который я использую для тестирования, вот мой файл:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%{SERVER_NAME}/?title=%1 [L]
я использую Apache / 2.4.10 (Win32) из ApacheLounge
У меня есть следующий домен и поддомен:
Оба указывают на один и тот же IP-адрес, как я и ожидал из приведенного выше .htaccess
:
если я получу доступ example.com/Article-Name/
перенаправление на example.com/?title=Article-Name
будет внутренний, Я не смогу увидеть ?title=Article-Name
на моей панели URL.
Вот исключение:
Если я получу доступ m.example.com/Article-Name/
перенаправление на m.example.com/?title=Article-Name
будет внешний и теперь я вижу m.example.com/?title=Article-Name
в моей строке URL.
Так что я ожидал такого же поведения, буду очень благодарен, если у кого-нибудь появится идея.
РЕДАКТИРОВАТЬ:
Я нашел решение проблемы, но меня все еще интересует вышеуказанная проблема, решение заключается в использовании:
RewriteRule ^ ?title=%1 [L]
Пожалуйста отметьте: это решение необходимо только для m.example.com, Я действительно понятия не имею, как это решение вообще работает, я опубликовал это решение, потому что оно может помочь найти причину вышеуказанной проблемы и как это решение вообще работает.
ИЗМЕНИТЬ 2 (полный файл .htaccess):
RewriteEngine On
<If "%{HTTP_HOST} = 'avielfadida.ml'">
# The actual condition is really long one so I replaced it for illustration.
RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]
RewriteRule ^ http://m.%{HTTP_HOST}%{REQUEST_URI} [R,L]
# I have to duplicate the RewriteCond and RewriteRule both inside the <If> and <Else>
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/?title=%1 [L]
# The solution(the solution is not required inside this block):
#RewriteRule ^ /?title=%1 [L]
</If>
<ElseIf "%{HTTP_HOST} = 'm.example.com'">
# I have to duplicate the RewriteCond and RewriteRule both inside the <If> and <Else>
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/?title=%1 [L]
# The solution(the solution is required here):
# RewriteRule ^ /?title=%1 [L]
DirectoryIndex /m/index.htm /m/index.php /m/index.html
</ElseIf>
Важная заметка: нет никакой связи между полным файлом .htaccess и проблемой, причина этого обновления - небольшая вероятность того, что я допустил ошибку, в любом случае я протестировал файл .htaccess только с 3 строками из вопроса.
Последнее обновление:
RewriteEngine On
# The actual condition is really long one so I replaced it for illustration.
RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]
RewriteCond %{HTTP_HOST} !^m\.example\.com$ [NC]
RewriteRule .* http://m.example.com%{REQUEST_URI} [R,L]
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule .* /?title=%1 [L]
<If "%{HTTP_HOST} = 'm.avielfadida.ml'">
DirectoryIndex /m/index.htm /m/index.php /m/index.html
</If>
То, как вы сделали с относительным путем, правильно
RewriteRule ^ ?title=%1 [L]
Абсолютный URL
Если указан абсолютный URL-адрес, mod_rewrite проверяет, соответствует ли имя хоста текущему хосту. Если это так, схема и имя хоста удаляются, а полученный путь рассматривается как URL-путь. В противном случае для данного URL выполняется внешнее перенаправление. Чтобы принудительно выполнить внешнее перенаправление обратно на текущий хост, см. Флаг [R] ниже.
m.example.com
будет рассматриваться как другой хост, и, следовательно, Apache выполняет внешнее перенаправление. Итак, чтобы убедиться, что выполняется только внутренняя перезапись, вам нужно использовать относительный путь, как вы это сделали.
Вы также можете убрать многое из файла .htaccess. Я думаю, это должно сделать то, что вы ищете.
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]
RewriteCond %{HTTP_HOST} !^m\.example\.com$ [NC]
RewriteRule .* http://m.exmaple.com%{REQUEST_URI} [R,L]
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule .* /?title=%1 [L]