Я пытаюсь работать с 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
?)