可能这个错误有一个非常简单的解决方案,但我一直在寻找这种方法,但仍然没有得到错误。我想我已经尽我所能了。
问题:当我在我的wordpress安装上启用漂亮的永久链接时(因此,它正在使用/%postname%/),它不起作用。除主页外,我在所有页面上都得到 404。
这个页面 http://codex.wordpress.org/Permalinks 告诉我永久链接工作的要求:
- 安装了mod_rewrite模块的 Apache Web 服务器
- 在WordPress的主目录中,
- 已启用"关注符号链接"选项
- 允许的 FileInfo 指令(例如 AllowOverride FileInfo 或 AllowOverride All)
- 一个.htaccess文件(如果缺少此文件,WordPress将在您激活"漂亮"永久链接时尝试创建它)
- 如果您希望WordPress自动更新.htaccess文件,WordPress将需要对文件的写入权限。
已安装 Apache Web 服务器,mod_rewrite 模块已加载 a2enmod 重写命令(之后服务器已多次重新启动)。因此,在/etc/apache2/mods-enabled 下,存在指向 rewrite.load 的符号链接。另外,当我运行phpinfo命令时,我看到mod_rewrite模块已加载。您也可以在此处检查:http://namorti.com/phpinfo.php
然后,在/etc/apache2/sites-enabled 中,没有"默认"存在。我将 000-default.conf 复制到默认值,然后编辑默认值。它包含以下内容: DocumentRoot/var/www
<Directory />
Options FollowSymLinks Indexes
AllowOverride FileInfo
</Directory>
因此,就我而言,已启用FollowSymLinks,并且允许使用FileInfo指令。
至于最后两点,在我的wordpress主目录(/var/www)中,.htaccess存在并且可以由Wordpress写入(我更新了permalink结构几次,并相应地更新了.htaccess文件)。现在它包含以下内容:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
所以,据我所知,它应该可以工作。我多次重新启动服务器(服务apache2重新启动)。我看不到我错过了什么。有人在这里有线索吗?
提前感谢!
*编辑*
所以,我做了卡尔奇奈告诉我要做的事情......我编辑了我的/etc/apache2/sites-enabled/default 文件(包含虚拟主机)。它现在看起来像这样:
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin www.namorti.com
DocumentRoot /var/www
<Directory /var/www>
Options MultiViews
AllowOverride None
Order allow,deny
allow from all
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
我再次重新启动了 apache,但不幸的是它仍然不起作用。老实说,这会让我感到惊讶,因为如果 htaccess 本身可以工作,将指令从 .htaccess 文件移动到 vhost 就会起作用,因为其他一切对我来说似乎都足够正确......
还有其他建议吗?感谢您的努力!
确保 AllowOverrides
指令设置为 all
在 vhost 中 - 这就是告诉 Apache 在 webroot 中查找.htaccess
文件的原因。
更好的解决方案实际上是将重写指令放在 vhost 中,因为您显然具有对文件的写入权限。 当你打开AllowOverrides时,apache会在每个请求的目录和所有父目录中查找.htaccess文件,这可能会对性能造成很大的影响。
对于Wordpress,你的vhost应该看起来像这样:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/site
<Directory /var/www/site>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
allow from all
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
</VirtualHost>
自己解决了。
它与文件"000-default.conf"有关 - 我将其复制到"默认"并编辑了"默认",就像我在问题中已经提到的那样。
显然,该服务正在自己上使用文件"000-default.conf"。通过将"默认"文件复制回"000-default.conf"并重新启动 apache 服务,现在一切正常。
一个警告:calcinai 的建议似乎应该有效,但是在他的 vhost 中的正确"000-default.conf"文件中的建议,我得到了一个 403 禁止错误。当我用原始内容替换他的内容时
DocumentRoot /var/www
<Directory />
Options FollowSymLinks Indexes
AllowOverride FileInfo
</Directory>
然后再次重新启动 apache 服务,一切都奏效了。
感谢calcinai努力帮助我:)
永久链接问题
在这个文件中,我们想改变所有的东西。
sudo nano /etc/apache2/sites-available/000-default.conf
000-default.conf
- 应该看起来像这样:
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<Directory /var/www/html/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
如果您没有看到这样,则将上述代码粘贴到虚拟主机中
完成后,保存并关闭文件。
接下来,我们需要启用重写模块,该模块允许您修改 URL。您可以通过键入以下内容来执行此操作:
sudo a2enmod rewrite
进行这些更改后,重新启动 Apache :
sudo service apache2 restart
这可以帮助您解决此问题:
sudo chown -R www-data:www-data /var/www
在花费了大量时间之后,以下是在我的Linux机器的LAMP服务器中成功运行的方法。我需要以下更改才能使其完美运行,
-
将其添加到您的
/etc/hosts
文件中。127.0.0.1 sitename.com
-
在路径
/etc/apache2/sites-available/sitename.com.conf
中添加主机条目,如下所示<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName sitename.com DocumentRoot /var/www/sitename.com/public_html <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/sitename.com/public_html> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
-
创建指向已启用站点的符号链接。
sudo ln -s /etc/apache2/sites-available/sitename.com.conf /etc/apache2/sites-enabled/sitename.com.conf
-
使用以下命令重新启动 apache,
sudo service apache2 restart
这对我来说非常有效。有关添加主机条目的说明取自,https://www.digitalocean.com/community/questions/wordpress-permalinks-not-working-on-ubuntu-14-04