ASP.NET MVC, маршрутизация URL: максимальный путь (URL) длина

Также проверьте Droid Apache [ http://incubator.apache.org/droids/] - это надеется не быть простой платформой паука/поискового робота/рабочего.

Это является новым и еще не является простым в использовании с полки (потребуется некоторая тонкая настройка для получения выполнения), но хорошая вещь бдительно следить за.

65
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Хорошо, поэтому я опубликовал это отчасти потому, что мы нашли обходной путь.

Надеюсь, это будет полезно кому-то в будущем: D

Обходной путь

Обходной путь довольно прост, и это тоже неплохо.

Поскольку мы знаем, какие части сайта должны будут использовать динамические параметры (и, следовательно, будут иметь динамический путь и длину), мы можем избежать отправки этого длинного URL-адрес для маршрутизации ASP.NET, перехватывая его до того, как он попадет в ASP.NET

Введите IIS7 Url Rewriting (или любой эквивалентный модуль перезаписи).

Мы устанавливаем такое правило:

    <rewrite>
        <rules>
            <rule>
                <rule name="Remove Category Request Parameters From Url">
                <match url="^category/(\d+)/{0,1}(.*)$" />
                <action type="Rewrite" url="category/{R:1}" />
            </rule>
        </rules>
    </rewrite>

В основном, что мы ' повторное выполнение - это просто сохранение достаточного количества пути, чтобы иметь возможность вызвать правильный маршрут вниз по течению. Остальную часть URL-адреса мы взламываем.

Куда идет остальная часть URL-адреса?

Что ж, когда срабатывает правило перезаписи, GenerateClientUrlInternal () , выполняется проверка, существует ли такой же заголовок модуля URL Rewrite (см. Выше):

// we only want to manipulate the path if URL rewriting is active, else we risk breaking the generated URL
NameValueCollection serverVars = httpContext.Request.ServerVariables;
bool urlRewriterIsEnabled = (serverVars != null && serverVars[_urlRewriterServerVar] != null);
if (!urlRewriterIsEnabled) {
    return contentPath;
}

Если это так, выполняется некоторая работа для сохранения исходного URL.

В нашем случае, поскольку мы не используем перезапись URL "обычным" способом, мы хотим сократить этот процесс.

Мы хотим сделать вид, что не было перезаписи URL, поскольку нам не нужны относительные пути следует рассматривать в контексте исходного URL.

Простейший способ взлома, который я мог придумать, заключался в полном удалении этой переменной сервера, чтобы ASP.NET MVC не мог ее найти:

protected void Application_BeginRequest()
{
    string iis7UrlRewriteServerVariable = "HTTP_X_ORIGINAL_URL";

    string headerValue = Request.ServerVariables[iis7UrlRewriteServerVariable];

    if (String.IsNullOrEmpty(headerValue) == false)
    {
        Request.ServerVariables.Remove(iis7UrlRewriteServerVariable);

        Context.Items.Add(iis7UrlRewriteServerVariable, headerValue);
    }
}

(Обратите внимание, что в приведенном выше я удаляю заголовок из Request.ServerVariables , но все же сохраняю его, пряча в Context.Items .

16
ответ дан 24 November 2019 в 15:24
поделиться

Думаю, вы изо всех сил пытаетесь использовать GET. Попробуйте изменить метод запроса на POST и поместить эти параметры строки запроса в тело запроса.

Длинный URL также не помогает SEO, не так ли?

2
ответ дан 24 November 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: