Назад | Перейти на главную страницу

Получить переменные становятся недоступными после перезаписи htaccess

Я пытаюсь работать с URL-адресами, оптимизированными для SEO, и в результате использую htaccess для перенаправления в более удобный пункт назначения. Однако, когда я выполняю эти перенаправления, я больше не могу получить доступ к переменным get с нового URL-адреса, даже если я могу получить их, когда перейду к старому. Я специально смотрю на строку «писатель», хотя остальное я включил для контекста. Есть идеи, как я могу исправить эту проблему?

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
RewriteRule ^writer/([0-9a-zA-z_-]+) writer?user=$1 [QSA,L]
RewriteRule ^article/([0-9a-zA-z_-]+)/([0-9a-zA-z_-]+) article?id=$1&title=$2 [QSA,L]

Похоже, что MultiViews может быть включен. Поскольку у вас есть writer в URL и writer.php (то же базовое имя), что и перезаписываемый файл, вам необходимо убедиться, что MultiViews (часть mod_negotiation) отключен, в противном случае MultiViews выдаст внутренний подзапрос для writer.php (без параметров URL) перед ваши директивы mod_rewrite могут обрабатывать запрос.

В верхней части вашего .htaccess файл:

Options -MultiViews
RewriteRule ^writer/([0-9a-zA-z_-]+) writer?user=$1 [QSA,L]

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

Другими словами:

RewriteRule ^writer/([0-9a-zA-z_-]+) writer.php?user=$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

И измените порядок директив так, чтобы «универсальное» правило добавления расширения файла было последним. Однако вы не можете переписать абсолютный путь к файловой системе в .htaccess, это должен быть URL-путь, поэтому используйте REQUEST_URI вместо того REQUEST_FILENAME в RewriteRule замена. Например:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !\.php$ %{REQUEST_URI}.php [QSA,L]

Однако, в зависимости от структуры вашей файловой системы, REQUEST_FILENAME и REQUEST_URI не обязательно будет ссылаться на один и тот же URL-путь. Так что может быть безопаснее использовать REQUEST_URI в состояние также. Например:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule !\.php$ %{REQUEST_URI}.php [QSA,L]

Вы также можете исключить запросы, содержащие любое расширение файла, например ваши статические ресурсы (изображения, css, js). В его нынешнем виде для каждого из этих запросов также будет (относительно дорогая) файловая система.

В итоге:

Options -MultiViews

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteRule ^writer/([0-9a-zA-z_-]+) writer.php?user=$1 [QSA,L]
RewriteRule ^article/([0-9a-zA-z_-]+)/([0-9a-zA-z_-]+) article.php?id=$1&title=$2 [QSA,L]

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule !\.php$ %{REQUEST_URI}.php [QSA,L]

ОБНОВИТЬ:

.htaccess находится в public_html, а writer.php находится в папке в public_html с именем users.

Если writer.php расположен в /users подкаталог, тогда вам, очевидно, нужно будет где-то ссылаться на этот подкаталог, либо в директиве (учреждение строка) или, возможно, используя RewriteBase директиву, если все файлы, в которые перезаписывается, находятся в этом подкаталоге.

Например:

RewriteRule ^writer/([0-9a-zA-z_-]+) users/writer.php?user=$1 [QSA,L]

Поскольку .htaccess файл находится в корне документа, то указанная выше директива предполагает, что вы делаете запрос в форме /writer/abc. Если запрос действительно для /users/writer/abc тогда вам нужно будет изменить RewriteRule шаблон соответственно (или переместите .htaccess файл в /users подкаталог - но тогда вы не должны изменять замена строка).

Обратите внимание, что замена строка (т.е. users/writer.php?user=$1) без ведущей косой черты (или схема + имя хоста) рассматривается как родственник. Это относительно расположения .htaccess файл, если RewriteBase определяется иначе.

(Поскольку writer.php по-видимому, первоначально вызывался без каких-либо параметров URL, тогда это звучит так, как будто вы, возможно, выполняли запрос формы /users/writer/abc?)