WordPress永久链接行为

时间:2018-09-04 23:22:36

标签: php wordpress .htaccess mod-rewrite permalinks

我正在运行一个AWS中型LAMP实例。我有三个Beta测试Wordpress网站都正在运行并呈现页面,但没有一个网站100%完整。服务器软件版本为:

php 7.0.3

httpd apache / 2.4.33

Wordpress 4.9.8

我花了很多时间研究自己的特殊挑战,包括编写一些插件代码以尝试理解问题,我已经接近了,但还没有破解问题。

我遇到的问题是,当我将永久链接设置更改为%postname%时,站点无法找到页面。在此阶段,我仅引用页面而不引用帖子。我还没有对帖子进行任何测试。

我已确认使用加载了mod_rewrite

sudo apachectl -t -D DUMP_MODULES
and
<?php phpinfo(); ?>

第一个命令列出了rewrite_module(共享)。 php脚本显示mod_rewrite是Loaded模块的一部分。

我关注的一个很好的资源是https://serverfault.com/questions/445599/enabling-mod-rewrite-on-amazon-linux。还有很多其他人,但这似乎抓住了所有其他搜索所提出的要点。

从上面的内容中,我接受了有关测试重定向的建议,该建议有效,将我的一个域路由到wordpress.org。 (为实现此测试,我编辑了/etc/httpd/conf/httpd.conf)

  

请尝试以下操作:在服务器配置中-不是.htaccess,请添加   行RewriteEngine On和RewriteRule ^(。*)$   http://www.wordpress.org/ [R]确认重写是否在   所有。它应该将所有流量传递到Wordpress网站

我还创建了一个基本插件来测试各种WordPress功能。我认为某些内部对齐方式可能导致WordPress无法找到请求的页面。将页面ID传递到get_permalink()函数时,WordPress发现了正确的页面,这是错误的。

我只是添加了一个回声get_permalink(290);到我的简单插件代码。正确地呼应了

https://www.mydomainname.com/correct-slug-for-page-290

如果我将URL复制并粘贴到它上面,则会失败。

注意:当我修改永久链接设置时,.htaccess文件会自动修改/更新。

如果我将WordPress永久链接设置设置为纯文本,则一切正常。

如果我将WordPress永久链接设置设置为custom并使用index.php /%postname%/所有链接都可以解决。 (同时存在和不存在.htaccess文件)

如果我将永久链接设置设为仅%postname%,则所有内容都会出现404错误。设置为%postname%时,wordpress会自动创建以下文件

-rw-r--r-- 1 apache www 235 Sep  4 21:47 .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

我的httpd.conf中包含大部分注释的摘录被删除。我确实计划返回并收紧一些设置,一旦我可以使用此基本功能。

赞赏任何见解,技巧或​​建议。谢谢大家。

#
ServerRoot "/etc/httpd"


Listen 80

Include conf.modules.d/*.conf


User apache
Group apache

ServerAdmin root@localhost

<Directory />
    AllowOverride All
    Require all granted
</Directory>

DocumentRoot "/var/www/html"

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride All
    # Allow open access:
    Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/html">
    Options Indexes FollowSymLinks

    AllowOverride All

    Require all granted
</Directory>

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

#
# The following lines prevent .htaccess and .htpasswd files from being 
# viewed by Web clients. 
#
<Files ".ht*">
    Require all denied
</Files>


<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule mime_module>
    TypesConfig /etc/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>


EnableSendfile on

# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf

<VirtualHost *:80>
    ServerAdmin webmaster@beta-test-one.com
    DocumentRoot /var/www/html/beta-test-one.com
    ServerName beta-test-one.com
    ServerAlias www.beta-test-one.com
    RewriteEngine On
    <IF "req('Host') != 'www.beta-test-one.com'">
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </IF>
    <ELSE>
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </ELSE>
    ErrorLog logs/beta-test-one.com-error_log
    CustomLog logs/beta-test-one.com-access_log common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@beta-test-two.com
    DocumentRoot /var/www/html/beta-test-two.com
    <Directory "/var/www/html/beta-test-two.com">
    AllowOverride All
    </Directory>
    ServerName beta-test-two.com
    ServerAlias www.beta-test-two.com
    RewriteEngine On
    <IF "req('Host') != 'www.beta-test-two.com'">
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </IF>
    <ELSE>
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </ELSE>
    ErrorLog logs/beta-test-two.com-error_log
    CustomLog logs/beta-test-two.com-access_log common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@beta-test-three.com.au
    DocumentRoot /var/www/html/beta-test-three.com.au
    ServerName beta-test-three.com.au
    ServerAlias www.beta-test-three.com.au
    RewriteEngine On
    <IF "req('Host') != 'www.beta-test-three.com.au'">
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </IF>
    <ELSE>
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </ELSE>
    ErrorLog logs/beta-test-three.com-error_log
    CustomLog logs/beta-test-three.com-access_log common
</VirtualHost>

1 个答案:

答案 0 :(得分:0)

问题已经解决。

我开始查看我的mod_rewrite设置。我意识到我已经从httpd.conf文件中进行了测试,但没有按照以下文章中的一些技巧在.htaccess级别进行重定向测试,

  

https://docs.bolt.cm/3.4/howto/making-sure-htaccess-works

最终,绕过了.htaccess文件。

最终的罪魁祸首是httpd.conf文件中对HTTP的显式重定向

df1 <- read.table(text =
    "id       time
1        '2018-08-28 11:22:40'
2        '2018-08-28 11:35:10'
3        '2018-08-28 11:50:00'
4        '2018-08-28 11:55:30'", header = T)

df2 <- read.table(text =
    "start_time             end_time
'2018-08-28 11:22:00'    '2018-08-28 11:22:50'
'2018-08-28 11:30:30'    '2018-08-28 11:34:10'
'2018-08-28 11:49:00'    '2018-08-28 11:52:20'
'2018-08-28 11:57:20'    '2018-08-28 11:59:40'", header = T)

我删除了这些行并再次进行了测试……标准的WordPress永久链接都已解决。我最初添加这些行是因为当我输入domain-name.com(不带https前缀)时,我收到的浏览器消息表明该站点不安全。

但是,通过如下更新wp-config文件(见下文),我不需要httpd.conf文件中的https重定向,这使得.htaccess重写规则可以正常工作。

 RewriteEngine On <IF "req('Host') != 'www.beta-test-three.com.au'">
 RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .*
 https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=301] </IF> <ELSE>
 RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .*
 https://%{HTTP:Host}%{REQUEST_URI} [L,R=301] </ELSE>