2014-08-10 22 views
0

Я пробовал просмотреть некоторые из вопросов mod_rewrite на сайте, но не нашел ответа на моя проблема (то, что большинство вопросов называлось «mod_rewrite не работает», не помогло сделать эту задачу легче, надеюсь, мой заголовок немного полезнее).mod_rewrite в .htaccess, go/*, go ?, go?/* Work, но go /? * Не

это содержание моего /somepath/.htaccess:

RewriteEngine On 
RewriteRule ^go/(.*) /cgi-bin/goto.cgi?$1 
    # ^^^ WORKS: /somepath/go/200001.. 
RewriteRule ^go?(.*) /cgi-bin/goto.cgi$1 
    # ^^^ WORKS: /somepath/go?200001.. 


ErrorDocument 404 /cgi-bin/goto.cgi?error404 

Во время тестирования я сделал goto.cgi просто вернуть $ ENV {QUERY_STRING}, $ ENV {QUERY_STRING_UNESCAPED} и $ ENV {PATH_INFO} , В настоящее время, вышеуказанные правила означают, что я набираюсь QUERY_STRING передается правильно, когда URLs:

/somepath/go/200001 
/somepath/go?200001 
/somepath/go?/200001 

доступны, но не тогда, когда

/somepath/go/?200001 

доступ, в этом случае $ ENV {QUERY_STRING} , $ ENV {QUERY_STRING_UNESCAPED} и $ ENV {PATH_INFO} пустые.

Таким образом, вопрос, какие правила можно использовать так, чтобы

/somepath/go/?200001 

дает мой сценарий? Существуют 200001 или даже /? 200001 часть обратно?

+0

Для дополнительного удовольствия и путаницы, перейдите в '/ somepath/getconfused' и удивляются, почему сервер жалуется, что'/CGI-BIN/goto.cgietconfused' не существует ;-) – Sumurai8

+0

@ Sumurai8 хе, да, Я упомянул об этой проблеме в комментариях к ответу. Спасибо за головы, хотя. – insaner

ответ

1

Первое правило уничтожает строку запроса в примере, который терпит неудачу, поскольку $1 будет пустым, а пустая строка запроса в подстановке удалит любую существующую строку запроса.

И второе правило - тарабарщина.

RewriteRule ^go/(.+)$ /cgi-bin/goto.cgi?$1 
RewriteRule ^go/?$ /cgi-bin/goto.cgi 
+0

Это почти отлично работает, это дает мне правильные результаты для вышеупомянутых URL-адресов, но также перенаправляет такие вещи, как/somepath/go200001, на мой скрипт, где должно быть только 404, как это можно зафиксировать? – insaner

+0

@insaner: Исправлено. –

+0

Изменение исправляет проблему/somepath/go200001, но приводит к тому, что/somepath/go /? 200001 больше не работает (дает мне результат 404). – insaner

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