2009-05-06 2 views
0

Вот мой файл .htaccess:.htaccess сталкиваясь с GET Params

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* ?p=$0 

Который должен перенаправлять mysite.com/?p=request только если request не является файлом. Но это неправильно соответствует запросу, например, http://mysite.com/auth.php?openid.ns=http%3A%2F из-за %2F (auth.php действительно существует). Я не понимаю, почему это затмевает ... идеи?

Edit: Ребята, я ставлю акцент на %2F (который является прямой слэш кстати), потому что отлично работает, когда этот персонаж не там

Чтобы было ясно,

I получить 404 для этой страницы: http://mysite.com/auth.php?openid.ns=http%3A%2F

, но не эту страницу: http://mysite.com/auth.php?openid.ns=http%3A


Просто FYI, я действительно ввернул этот вопрос. Это была ошибка 403, которая произошла в любое время, когда% 2F появился в URL-адресе. Мое приложение ломало эту ошибку и выплескивало обманчивое 404, которое может быть менее пугающим для конечного пользователя. На самом деле не имеет никакого отношения к .htaccess. Более подробно в моем ответе ниже.

+0

Вы можете включить очень подробные журналы перезаписи и, возможно, разместить соответствующие части здесь, чтобы мы могли видеть, что происходит на самом деле. – kch

+0

Могу ли я включить подробный доступ через .htaccess? Я на общем сервере, у меня нет доступа ко всем увлекательным настройкам apache (а я и apache n00b) – mpen

ответ

0

Не проблема AllowEncodedSlashes. Он набрал правило mod_security, которое запрещает http:// в параметрах для предотвращения вставки файлов. Они отменили его для меня.

0

Можете ли вы убедиться, что это не значит?

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f 

, чтобы проверить, что значение переменной, используйте что-то вроде:

RewriteRule (.*) http://www.google.com/?test=%{REQUEST_FILENAME} [L] 

, если он не имеет полное FilePath к файлу auth.php, он не найдет его , я получил эту информацию здесь:

http://mail-archives.apache.org/mod_mbox/httpd-bugs/200812.mbox/

+0

% {REQUEST_FILENAME} выплескивает полное имя файла,/home/username/public_html/mysite/auth – mpen

0

Это, вероятно, связано с тем, что у вас нет скобок в своем регулярном выражении, так отлов не бывает. Следующие работы для меня:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ ?p=$1 [L,QSA] 
+0

Уверен, что так получилось; $ 0 - это все. Протестировано, чтобы убедиться. – mpen

3

Возможно ли, что вам нужно включить AllowEncodedSlashes, который по умолчанию отключен? Когда эта директива отключена, запросы, содержащие закодированные символы с обратной и обратной косой чертой (т.е.% 2F и% 5C), получают отказ в размере 404.

Я смутно помню, как видел эту проблему в MediaWiki, где всевозможные забавные вещи должны выполняться при выходе из заголовков и т. д., чтобы избежать различных взлетов на разных уровнях обработки запросов. Оказывается, довольно много вещей в земле Apache, как возиться с PATH_INFO и т. Д., Что не оставляет конца аду для всех нас.

+0

Это звучит так, как будто это может быть проблемой, но при включении AllowEncodedSlashes он дает мне внутреннюю ошибку сервера 500, даже с правилами * no * rewrite :( – mpen

+0

Проверьте журнал ошибок Apache, что такое «внутренняя ошибка», которая происходит? Это может привести к некоторому намеку. Я бы посоветовал также второй совет kch, включив подробное ведение журнала перезаписи и взглянув на вывод журнала из неудавшегося запроса, чтобы увидеть, что на самом деле происходит. Http://httpd.apache.org/docs/2.2 /mod/mod_rewrite.html#rewritelog содержит информацию о том, как включить переписывание протоколов. – Rob

+0

Использование RewriteLog также дает мне внутреннюю ошибку сервера ... я полагаю, что администраторы отключили его. Не удается проверить журнал ошибок apache, не связываясь с ним администраторы тоже. Я буду скулить на них и посмотреть, что они скажут. – mpen

0

рад, что вы поняли, что у вас есть хостинг-провайдер. находили ли вы другие слэш-комбинации, которые работали и противостояли им? ;)

Ответ, не связанный с Apache, заключается в том, чтобы не передавать известную строку «http: //» в параметре вообще.глядя на мою страницу учетной записи stackoverflow как пример openID, она даже не хранит «http: //» вообще, просто «me.yahoo.com/a/swxth ....».

Возможно, это настоящий ответ. если приложение ожидает сделать что-то внутренне с URL-адресом «http», оно должно знать, чтобы добавить его к началу в последний ответственный момент.

+0

Да, за исключением того, что мое веб-приложение не генерирует эти URL-адреса. Они поступают из Google и Yahoo! и тому подобное; Я пытаюсь реализовать поддержку OpenID, например, StackOverflow. Почти сделано сейчас :) – mpen

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