Как выполнить веб-страницу PHP без the.php расширение в URL-адресе?
Извините за вопрос noob, не могу понять, из чего я должен искать.
Я создаю сайт с этой страницей product.php?id=777
Я бы хотел, чтобы это было product/777
Спасибо вам!
6 answers
Создайте файл .htaccess в корневом каталоге вашего веб-сайта и введите там следующее:
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^product/([0-9]+)$ product.php?id=$1
Вместо использования mod_rewrite вы также можете использовать в своем.htaccess следующее:
DefaultType application/x-httpd-php
И просто назовите свой скрипт product
на сервере (без расширения файла .php).
Таким образом, вы можете вызвать его напрямую и получите любую добавленную строку как $_SERVER["PATH_INFO"]
Это то, что фреймворки, такие как CodeIgniter и Zend, выполняют с легкостью, но все еще могут быть выполнены только с помощью Apache mod_rewrite
, как предлагали другие. В принципе, используйте .htaccess, подобный этому, чтобы направлять весь трафик на одну страницу:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?_url=$1 [QSA,L]
</IfModule>
Как только вы попадете на эту страницу, вы сможете проанализировать эту переменную _url
, которая может быть любого формата, который вы хотите, и соответствующим образом обработать запрос.
Для меня этот код работает:
В "/etc/apache2/сайты-доступны/по умолчанию" или "httpd.conf"
У вас должны быть (по крайней мере) эти параметры в каталоге по умолчанию
...
<Directory />
...
Options FollowSymLinks
AllowOverride All
...
</Directory>
...
ИЛИ в каталоге конкретного сайта
...
<Directory "/var/www/my-site">
...
Options FollowSymLinks
AllowOverride All
...
</Directory>
...
И создайте (он может не существовать, убедитесь, что он доступен для чтения apache) или отредактируйте ".htaccess" в каталоге сайта (например, "/var/www/мой сайт/.htaccess") и добавьте этот код:
AddType application/x-httpd-php htm html php
AddHandler application/x-httpd-php .htm .html
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Если вы не хотите использовать mod_rewrite (я этого не делал), а другие ответы, похоже, не сработали для вас (они не сработали для меня). Тогда вы можете попробовать это, если вы работаете на Apache 2.4+.
Более небезопасная версия: сделайте что-нибудь без расширения, запускаемое как PHP-файл (это не так уж плохо, если, как в моей реализации, у вас есть только один файл для всего сервера, но все равно оставило бы вас открытым для произвольного выполнения, если бы кто-то смог записать файл в этот каталог... тогда опять же, если они могут написать файл, они могли бы дать ему расширение PHP, поэтому не совсем уверены, действительно ли это расширяет ваши возможности.)
<FilesMatch "^[^.]+$">
ForceType application/x-httpd-php
</FilesMatch>
Поместите это либо в файл .htaccess для вашего каталога (при условии, что они у вас включены), либо поместите его непосредственно в фрагмент в определении вашего хоста.
Если вы хотите сделать его более конкретным (и, возможно, более безопасным), вы можете просто заменить регулярное выражение чем-то более конкретным:
<FilesMatch "^MySingleFileWithNoExension$">
ForceType application/x-httpd-php
</FilesMatch>
Затем просто перезапустите Apache, и все готово!
Я делал это в течение многих лет, используя следующее для выполнения файла с именем "Поддержка" (НЕ Support.php, Я не хотел двух способов получить доступ к файлу).
<Files Support>
SetHandler php-script
</Files>
Однако у меня начались проблемы с этим при использовании Plesk для выполнения сценариев как PHP 7.0. Корневой (.com/index.php ) будет работать как PHP 7 просто отлично, но любой из моих файлов php-скриптов (.com/Support) будет работать как моя версия PHP 5.4 по умолчанию Plesk. Мне еще предстоит выяснить, почему он это делает, но это обходится проблема установки обработчика по умолчанию.