2010-11-19 2 views
2

В настоящее время у меня есть следующий .htaccess..htaccess перенаправляет, если присутствует строка запроса ANY?

<IfModule mod_suphp.c> 
suPHP_ConfigPath /home/abc/php.ini 
</IfModule> 

RewriteEngine on 
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

AuthType Basic 
AuthName "Está dominado!!" 
AuthUserFile "/home/abc/.htpasswds/public_html/passwd" 
require valid-user 

Теперь, я хотел бы, если какая-либо строка запроса найдена после/удаляет эту строку запроса.

Итак: Если мы имеем:

http://www.abc.com/ somethinghere234

Он должен перенаправлять:

HTTP : //www.abc.com/

Если мы имеем:

htpp: //www.abc.com/something/ id212

Перенаправление на:

htpp: // www.abc.com/something/

UPDATE: Я попытался это:

TRY A)

RewriteCond %{QUERY_STRING} ^(.*)$ 
RewriteCond %{REQUEST_URI} !^/index.php 
RewriteRule .* /index.php/ [L,QSA] 

перестроении, что^(*) $ позволит что-либо на строку запроса ...

я. ве также попытался это:

TRY B)

RewriteEngine on RewriteCond $ 1 !^(Index.php | media | css | js | images | robots.txt) RewriteCond% {QUERY_STRING}^(. ) $ RewriteRule^(.) $ http://abc.com/ [L]

Это возвращает внутреннюю ошибку сервера на 500.

TRY C)

RewriteEngine on 
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt) 
#RewriteCond %{REQUEST_URI} !^/index.php 
RewriteCond %{QUERY_STRING} ^(.*)$ 
RewriteRule ^(.*)$ http://abc.com/ [R=302,L] 

Признаюсь, я бы потерял на этом .htaccess синтаксисом.

TRY D)

RewriteEngine on 
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt) 
RewriteCond %{REQUEST_URI} !^/ 
RewriteCond %{QUERY_STRING} ^(.*)$ 
RewriteRule ^(.*)$ http://abc.com/ [R=302,L] 

Пожалуйста, советы, MEM

ответ

4

должно работать:

RewriteCond %{QUERY_STRING} . 
RewriteCond %{REQUEST_URI} !^/index.php 
RewriteRule^/index.php/? [L] 
  1. проверить, если у вас есть что-то в QUERY_STRING (ваш также принимает пустую строку)
  2. чек, чтобы предотвратить бесконечные Redirect
  3. Redirect туда, где вы хотите.

Из документации Apache:

Если вы хотите, чтобы удалить существующую строку запроса, конец этого заменит строки только с вопросительным знаком

EDIT (еще раз): В качестве внешнего перенаправления (вам может даже не понадобиться второй RewriteCond, если у вас нет какой-либо строки запроса в вашем приложении):

Это скажет клиенту запрашивать тот же URI без строки запроса.

RewriteEngine on 

# redirect to same URI, but without query string 
RewriteCond %{QUERY_STRING} . 
RewriteRule^%{REQUEST_URI}? [R=301] 

# CodeIgniter "magic" 
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L] 
+0

@icanhasserver - Это возвращает ошибку 404, когда я помещал строку запроса. :(Не повезло тогда. – MEM

+0

Вы должны сопоставить RewriteRule с фактическим местоположением вашего PHP-скрипта. Трейлинг/может и не обязательно. Трудно сказать, не зная настройки. Если он находится на том же уровне, что и файл .htaccess : index.php? – icanhasserver

+0

Спасибо. Я над CodeIgniter, если это имеет значение, но да, файл index.php находится на том же уровне, что и файл .htaccess. На первом .htaccess (опубликовано выше) у меня есть это правило: RewriteRule^(. *) $ /index.php/$1 [L], и он работает в этом случае. – MEM

1

Возможно потому, что у вас есть QSA добавил там - это значит, Строка запроса Append.

2

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

RewriteEngine On 

# Remove the query string with a redirect 
RewriteCond %{QUERY_SRING} !="" 
# But only if the path ended with a/
# (remove this to redirect anything with a query string) 
RewriteCond %{REQUEST_URI} /$ 
RewriteRule .* /$0? [R=301,L] 

# Then perform your internal rewrite 
RewriteCond $1 !^(index\.php|media|css|js|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L] 
+0

Почти, так что я верю. Я получаю 404, когда я пытаюсь выполнить внутреннюю переадресацию. Но, если я изменюсь, на последнем RewriteRule на что-то вроде: http://somexternalsite.com/$1 [L] это сработает. :( – MEM

+0

@MEM Возможно, Apache не любит вашу внутреннюю переписку с помощью PATH_INFO. Вы можете попробовать добавить 'AcceptPathInfo On' к вашему.htaccess или удалить '/ $ 1' во втором RewriteRule и изменить' $ config ['uri_protocol'] 'на' REQUEST_URI' в вашей конфигурации CodeIgniter. –

+0

Большое спасибо Тим. У меня установлен uri_protocol для request_uri, это будет вопрос тестирования AcceptPathInfo On и удаления вызова условия/$ 1. Я АФК - как только я вернусь к нему, я отправлю обратно. Большое спасибо. – MEM

Смежные вопросы